軽量スクリプト言語としての Javascript は、ES6 と node.js の登場により新たな高みに押し上げられました。オブジェクトを生成するための新しいクラス構文形式は ES6 に登場しましたが、まだ ES5 を開始する必要があります。 ES6 では、JavaScript のネイティブ実装を使用して、その継承実装を理解できるように、より簡潔な固定クラス宣言メソッドを提供しています。
JavaScriptの継承は開発者によって理解が異なり、主に4つのタイプに分かれると思います
- 原型链继承 - 对象冒充继承(构造函数继承 不过我不喜欢这个名字) - 组合继承 - 寄生组合继承
継承については、事前にAnimalを宣言してから、さまざまな継承方法について話し合うことができます。
let Animal = (function () { function Animal (name) { this.name = name || 'Animal'; this.sleep = function(){ console.log(this.name + '正在睡觉!'); } } Animal.prototype.eat = function(food) { console.log(this.name + '正在吃:' + food); } return Animal; })()
プロトタイプチェーンの継承
let Cat = (function () { function Cat(){ } Cat.prototype = new Animal(); Cat.prototype.name = 'cat'; return Cat; })()
原型链是 javascript 的典型继承方式, 这种继承方式的最大特点就是共享,所有事例共享原型对象中的所有属性和方法, 共享是它的最大优点 也是它的最大缺点, 正对我们的不同需求, 比如大多数情况下我们常常需要某些属性是子类特有的 而一些读取属性方法需要共享,--另外此种继承无法向父类传参,无法实现多继承
オブジェクト偽装継承
let Cat = (function () { function Cat(name){ Animal.call(this,name); } return Cat; })()
对象冒充继承就是简单的利用call或者apply方法实现继承,这种继承最大的特点正好与原型链继承相反不能继承原型属性/方法--非共享(子类自有一份), 同样这是它的优点也是它的缺点, 另外它解决了原型链继承中无法向父类传参的缺点, 并且可以实现某种意义上的多继承--(注意这种多继承是打引号的)
組み合わせ継承
let Cat = (function () { function Cat(name){ Animal.call(this, name); } Cat.prototype = new Animal(); Cat.prototype.constructor = Cat; return Cat; })()
组合继承是比较好的继承, 他是原型链继承和对象冒充继承的合体, 合理的利用了这两种组合的特点(是特点不是优点^_^),既是子类的实例,也是父类的实例, 但有一个缺点就是调用了两次父类构造函数,生成了两份实例(子类实例将子类原型上的那份屏蔽了)造成内存浪费. 这也是用的最多的一种
寄生組み合わせ継承
let Cat = (function () { function Cat(name){ Animal.call(this, name); } (function(sub, sup){ var Super = function(){}; Super.prototype = sup.prototype; sub.prototype = new Super(); sub.prototype.constructor = sub })(Cat, Animal) return Cat; })()
寄生組み合わせ継承は、組み合わせ継承を改良したものだと個人的には思っています。組み合わせ継承メモリの無駄の問題 ^_^
関連する推奨事項:
継承を実装するために JavaScript を使用する必要があるのはなぜですか?いくつかの継承メソッドを例付きで詳しく解説
Javascriptプロトタイプチェーン継承メソッドの使い方とデメリット
以上がES5 の例では、JavaScript のさまざまな継承メソッドを詳しく説明しています。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。