Child1.prototype = BaseClass.prototype;
Child1.prototype = Object.create(BaseClass.prototype)
であるべき
プロトタイプオブジェクトを同じにしたくない場合は、継承元の新しいプロトタイプオブジェクトが必要ですBaseClass
Live Example
免責事項:Object.create
はES5は、レガシープラットフォームのサポートのためにES5-shimを使用しています。
あなたはより徹底的に例を与えること:
// Create base prototype
var Base = {
method: function() {
return this.things;
},
constructor: function (things) {
this.things = things;
}
};
// Link constructor and prototype
Base.constructor.prototype = Base;
// Create child prototype that inherits from Base
var Child = Object.create(Base);
// overwrite constructor
Child.constructor = function (things) {
things++;
Base.constructor.call(things);
}
// Link constructor and prototype
Child.constructor.prototype = Child;
// Swap prototype and constructor around to support new
ChildFactory = Child.constructor;
var c = new ChildFactory(41);
console.log(c.method()); // 42
視覚:
var Base = { ... }
ここで我々は単にメソッドとプロパティを持つオブジェクトを作成します。このオブジェクトのインスタンスを作成したいと考えています。だからBase
は "クラス"であり、すべてのメソッドとプロパティはインスタンス(constructor
を含む)からアクセスできます。
Base.constructor.prototype = Base;
あなたはプロトタイプオブジェクトと一緒にあなたのオブジェクトConstructorFunction.prototype
の新しいインスタンスを与えるあなたはnew
で呼び出すことができる機能である「コンストラクタ関数」をリンクする必要があります。これは基本的にあなたが手作業で行う必要がある接着剤です。なぜなら、ESはこれをあなたのためにしていないからです。
これを忘れた場合、コンストラクタ関数(X.constructor
)には、インスタンスを継承するための.prototype
プロパティがありません。
var Child = Object.create(Base);
その[[Prototype]]
Base
ある新しいオブジェクトを作成します。これは基本的に今、私たちは子供のインスタンスが継承するメソッドです私たちの子オブジェクトにプロパティを追加するには、プロトタイプチェーン
Child -> ([[Prototype]] = Base) -> ([[Prototype]] = Object.prototype) -> null
Child.x = ...
の始まりです。基本的には、継承する新しいプロトタイプオブジェクトを作成しています。すべてのインスタンスがメソッドを共有し、プロトタイプチェーンまでのメソッドを共有します(Base
を含む)。
ChildFactory = Child.constructor;
new
キーワードだけコンストラクタ関数上で動作していないプロトタイプは、私たちは基本的に「コンストラクタ関数の変数に、当社のプロトタイプオブジェクト変数を切り替える」と言う必要があるオブジェクト
個人的には「クラスを構築「プロトタイプオブジェクトは実際には直接扱うのが楽しく、インスタンスを作成するときにはコンストラクターの機能が使い勝手が良いとわかりました。我々はvar c = new Child(41);
を呼び出すとき
さてそれから、ベースのコンストラクタを呼び出し、things
をインクリメントします、我々は定義されたコンストラクタ関数を呼び出します。この時点で
注Cのプロトタイプチェーンを使用すると、プロトタイプに割り当てた場合、それはあなたがそれを完全に上書きすることを意味するものではありません
c -> ([[Prototype]] = Child)
-> ([[Prototype]] = Base)
-> ([[Prototype]] = Object.prototype)
-> null
にOOPの正しい実装になります。ここJSで継承を使用する多くの方法の優れたリソースです/www.3site.eu/doc/ –