为什么这个阵列原型不起作用?



我不明白为什么数组 b[1] 不使用 f 作为 getter 和 setter,而数组 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

var a = []做了一件事:它将a设置为new Array的实例,但没有任何成员,因此prototype[0]是继承的。

var b = [1]做了两件事:它将b设置为new Array的实例(与a一样),但随后直接设置下标[0] = 1(绕过JavaScript的原型系统),这意味着[0] = 1覆盖"0th"属性,从而完全避免prototype[0]defineProperty

这与对象的工作方式相同:

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"

最新更新