2017-02-28 14 views
0

配列b [1]がfをゲッターとセッターとして使用していないのに配列aが使用する理由を理解できません。どちらも配列です。私はここで何が欠けているのですか?なぜこの配列プロトタイプは機能しませんか?

function f(){ 
    print("in f"); 
} 


Object.defineProperty(Array.prototype, "0", 
    { get : f, set:f}); 

var a=[]; 
var b=[1]; 

a[0]; // prints f 
a[0]=1; //prints f 
b[0]; // no print 
b[0]=1; // no print 

console.log("a is an array " + Array.isArray(a)); //a is an array true 
console.log("b is an array " + Array.isArray(b));//b is an array true 
+0

を? 'defineProperty'はオーバーライドされています。 – Li357

+0

'b'は独自のプロパティ0を持ち、' ​​a'はそうではないので? – nnnnnn

+0

'a'はまだ空であるため、' 0'プロパティはありません。 –

答えて

1

var a = []一つのことを行います。それはnew Arrayのインスタンスとしてではなく任意のメンバーなしaを設定し、そのprototype[0]は継承されます。

var b = [1]は、2つのことを行います。それは、[0] = 10番目の」プロパティを上書きすることを意味する、(JavaScriptののプロトタイプシステムをバイパスして)(aのように)new Arrayのインスタンスとしてbを設定しますが、その後、直接添字[0] = 1を設定し、したがってdefinePropertyprototype[0]に完全には入りません。

これはオブジェクトと同じように動作します:それはインデックス0の一つの要素を持っているとして、 'B'のプロトタイプがすでにプロパティ0を持っているため

Object.defineProperty(Object.prototype, "foo", { get: f, set: f }); 

var a = {}; 
a.foo = 1; // will print "in f" 

var b = { foo: 'a' } 
b.foo = 1; // will not print "in f" 
関連する問題