質問のバージョンに誤りがありObject.create
ます。ループは、プロパティをコンストラクター関数にアタッチしますF
(返されたオブジェクトやそのプロトタイプではありません)。つまり、作成されたオブジェクトではアクセスできません。
2番目のパラメータのプロパティはObject.create
、新しく作成されたオブジェクトにコピーされることになっています。のMozillaドキュメントでObject.create
は、次のようになっています。
指定され、未定義でない場合、列挙可能な独自のプロパティ(つまり、それ自体で定義され、プロトタイプチェーンに沿った列挙可能なプロパティではないプロパティ)を持つオブジェクトは、対応するプロパティ名とともに、新しく作成されたオブジェクトに追加されるプロパティ記述子を指定します。
Object.create
質問のバージョンで次のコードを実行してみてください。
o = Object.create(
{a: "prototype's a", b: "prototype's b"},
{a: "object's a"}
);
あなたはそれを見つけるでしょうo.a == "prototype's a"
そしてo.b == "prototype's b"
、"object's a"
は失われます。
次のバージョンの関数の方がおそらく便利です。
Object.create = function(o, props) {
var newObj;
// Create a constructor function, using o as the prototype
function F() {}
F.prototype = o;
// Create a new object using F as the constructor function
newObj = new F();
// Attach the properties of props to the new object
if (typeof(props) === "object") {
for (prop in props) {
if (props.hasOwnProperty((prop))) {
newObj[prop] = props[prop];
}
}
}
return newObj;
};
同じ例で試してみましょう。
o = Object.create(
{a: "prototype's a", b: "prototype's b"},
{a: "object's a"}
);
新しいオブジェクトは、プロパティとそれ自体のプロパティo
を持つプロトタイプで作成されます。a
b
a
o.b
最初に見てみましょう:。というプロパティがないため、o.hasOwnProperty("b")
が返されます。そこでプロトタイプが登場します。プロパティがないため、プロトタイプで検索されます。したがって、。false
o
b
b
o.b === "prototype's b"
一方、プロパティがあるため、o.hasOwnProperty("a")
が返されます。 プロトタイプからは何も検索されません。true
o
a
o.a == "object's a"
@chuckjの回答で指摘されているように、の正しい実装Object.create
はこれよりも複雑です。詳細については、ECMAScript5のオブジェクトとプロパティに関するJohnResigの投稿を参照してください。