私の理解では、プロトタイプチェーンをチェックせずにオブジェクトに特定のメンバーがある場合、「hasOwnProperty」はtrueを返します。しかし、他のオブジェクトから継承すると、最後のオブジェクト自体にすべてのメンバーが表示されます。
次の例を考えてみましょう。
var Object1 = function (param) {
this.prop1 = "p1 " + param;
this.prop2 = "p2 " + param;
};
var Object2 = function (param) {
Object1.apply(this, arguments);
this.prop3 = 'p3' + param;
};
Object2.prototype = new Object1();
var b = new Object2('this is Object 2');
for (var v in b)
print(v + ": " + b[v] + (b.hasOwnProperty(v)?' (own)':' (inherited)'));
このコードは次のように出力します。
--prop1: p1 this is Object 2 (own)
--prop2: p2 this is Object 2 (own)
--prop3: p3this is Object 2 (own)
デバッガーを見ると、次のように表示されます。
b
Object2
prop1: "p1 this is Object 2"
prop2: "p2 this is Object 2"
prop3: "p3this is Object 2"
__proto__: Object1
しかし、私はその行を削除しapply
ます。すべてがより理にかなっていますが、ベースオブジェクトは初期化されていません。
--prop3: p3this is Object 2 (own)
--prop1: p1 undefined (inherited)
--prop2: p2 undefined (inherited)
これで、デバッガーに次のように表示されます。
b
Object2
prop3: "p3this is Object 2"
__proto__: Object1
prop1: "p1 undefined"
prop2: "p2 undefined"
__proto__: Object
私の知る限り、これapply
は...スーパークラスコンストラクターを実行するようなものなので、スーパーメンバーは正しく初期化されますが、明らかに子オブジェクトの形状が変わります。
なぜこうなった?JSで継承する正しい方法(または少なくとも面倒ではない方法)は何ですか?
私はそれについていくつかの情報を調べています、そしてどうやら各開発者はそれを行う方法について異なる感情を持っています。
よろしく。