原型和对象属性。他们为什么表现不一样?

时间:2014-10-04 13:45:26

标签: javascript object prototype

为什么原型与普通物体不同?

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

我不打算在实践中使用它,但我想更好地了解这里发生了什么。

修改:您如何看待相同的行为?

1 个答案:

答案 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的变量,其默认长度为0console.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