...異なるプロパティを持つ複数のオブジェクトを処理する一般的な方法ですが、同じメソッドはコンストラクターを使用します...
はい、他の一般的な方法は (ご覧のとおり)Object.create
です。
ここでの私の理解はgoat
、の関数を継承/参照することですAnimal
。
そうではありません。new Animal
式では、goat
によって参照されるオブジェクトがAnimal.prototype
その基になるプロトタイプとして割り当てられます。への直接接続はなく、 への接続Animal
のみAnimal.prototype
です。(は通常、そのプロパティを介してAnimal.prototype
参照されますが、誰かが新しいオブジェクトを に割り当てると、そのリンクが壊れる可能性があります。)Animal
constructor
Animal.prototype
ここで継承がAnimal
失われるのでしょうか、それともGoat
まだAnimal
メソッドを参照していますか?
コンストラクター以外の例でgoat
はAnimal
、その基になるプロトタイプとして取得されるため、それ自体で見つからないプロパティについてgoat
、JavaScript エンジンはそれAnimal
があるかどうかを確認します。あなたの例では、それは from を使用していることを意味しますが、独自の を持っているため、を使用していません。goat
sayHello
Animal
type
goat
type
これに相当するものは次のとおりです。
function Animal ( type ) {
this.type = type
};
Animal.prototype.sayHello = function () {
return 'Hi, I am a ' + this.type
};
var goat = new Animal( 'Goat' );
...Object.create
代わりにプロトタイプを設定するために使用すると、次のようになります。
var animalPrototype = {
sayHello: function () {
return 'Hi, I am a ' + this.type
}
};
function createAnimal(type) {
var rv = Object.create(animalPrototype);
rv.type = type;
return rv;
};
var goat = createAnimal( 'Goat' );
あなたのコメントについて:
animalPrototype
内部createAnimal
と呼び出しを含む問題はありますObject.create(this.animalPrototype)
か?
これを意味する場合:
function createAnimal(type) {
var animalPrototype = { // Issue #1
sayHello: function () {
return 'Hi, I am a ' + this.type
}
};
var rv = Object.create(this.animalPrototype); // Issue #2
rv.type = type;
return rv;
};
var goat = createAnimal( 'Goat' );
...では、はい、2 つの問題があります。
- への呼び出しごとに新しい を作成しますが、これは目的を無効にし、 2.への呼び出し内では、グローバル オブジェクト (ルース モード) または(厳密モード) のいずれかになるため、おそらく必要な式ではありません。
animalPrototype
createAnimal
this
createAnimal
undefined
this.animalPrototype
あなたはこれを行うことができます:
function createAnimal(type) {
var rv = Object.create(createAnimal.proto);
rv.type = type;
return rv;
};
createAnimal.proto = {
sayHello: function () {
return 'Hi, I am a ' + this.type
}
};
var goat = createAnimal( 'Goat' );
もちろん、これはコンストラクター関数に非常によく似ているため、混乱を招く可能性があります。