为什么原型与普通物体不同?
var obj={'length':4}
obj._length=obj.length
console.log(obj._length); // 4
数组是一个对象,它的原型也是如此,所以应该看到相同的行为......
var a=[0,1,2,3];
Array.prototype._length=Array.prototype.length;
console.log(a.length,a._length); // 4,0
我不打算在实践中使用它,但我想更好地了解这里发生了什么。
修改:您如何看待相同的行为?
答案 0 :(得分:3)
在第一种情况下,您要在对象上创建一个名为_length
的新属性,并在其中分配length
属性的值。因此,改变一个不会影响另一个。您可以像这样确认
var obj={'length':4}
obj._length=obj.length
console.log(obj._length);
# 4
obj.length = 15;
console.log(obj._length);
# 4
在第二种情况下,当您创建一个Array对象时,length
属性将在对象本身上设置,而_length
在原型链中,而不在对象本身上。< / p>
console.log(a.hasOwnProperty("length"), a.hasOwnProperty("_length"));
# true false
此外,您已在Array
原型中创建了一个名为_length
的变量,其默认长度为0
(console.log(Array.prototype.length);
)。因此,所有后续数组也都具有该属性。
var a = [0, 1, 2, 3];
Array.prototype._length = Array.prototype.length;
console.log([]._length);
# 0
所以,我们在这里谈论两个不同的属性。 length
特定于所有Array
个对象,其中_length
对所有Array对象都是通用的。
您可以像这样确认
var a = [0, 1, 2, 3];
Array.prototype._length = Array.prototype.length;
console.log([1, 2, 3]._length);
# 0
console.log([1, 2, 3, 4]._length);
# 0
由于_length
不是自己,当您尝试访问它们时,它们会查找原型链以在Array.prototype
中找到它。所以,他们都打印0。
如果您希望获得length
_length
属性,可以在原型中定义它,就像这样
Object.defineProperty(Array.prototype, "_length", {
get: function() {
return this.length;
},
set: function(newValue) {
this.length = newValue;
}
});
console.log([]._length);
# 0
console.log([1, 2, 3]._length);
# 3