gpt4 book ai didi

javascript - 扩展原生数组对象,长度可枚举?

转载 作者:行者123 更新时间:2023-12-02 17:46:51 24 4
gpt4 key购买 nike

这是我的尝试

var extend = function(base, sub) {
sub.prototype = Object.create(base.prototype);
sub.prototype.constructor = sub;
};

MyArray = function() {
Array.call(this, arguments);
};

extend(Array, MyArray);

var arr = new MyArray();

arr.push(1);
arr.push(2);
arr.push(3);

console.log(arr);

for (var i in arr) {
if (arr.hasOwnProperty(i)) {
console.log(i + " => " + arr[i]);
}
}

以及它生成的输出(在节点中运行)

{ '0': 1, '1': 2, '2': 3, length: 3 }
0 => 1
1 => 2
2 => 3
length => 3

我假设通过调用Array.call(this,arguments)

我会将对象的构造传递给 native 构造函数,它应该将长度处理为不可枚举。

当切换到 new Array() 时,它会生成以下输出。

[ 1, 2, 3 ]
0 => 1
1 => 2
2 => 3

一般问题是为什么结果对象存在差异,更具体地说,为什么 length 属性是可枚举的?

最佳答案

I assume by calling Array.call(this, arguments) I would be passing off the construction of the object to the native constructor, which should handle the length as not enumerable.

没有。 EcmaScript 5 does not allow to subclass Array - 在像节点这样的受控环境中,您只能使用 var arr=[]; arr.__proto__=mycustomprototype;黑客攻击。

Array.call(this) 不幸的是不起作用。它返回一个新数组,该数组没有被分配任何内容,但它不会对 this 执行任何操作。 。您可以通过this !== Array.call(this)查看.

那么你是如何获得length的呢?您的自定义对象上的属性? push 确实创造了它。它看到了继承的Array.prototype.length属性( 0 ),因此在插入数字后,它确实分配了 arr.length = 1它创建了一个可枚举属性。

关于javascript - 扩展原生数组对象,长度可枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21682544/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com