gpt4 book ai didi

javascript - 在 JavaScript ES5 中对数组进行子类化

转载 作者:行者123 更新时间:2023-11-30 23:59:12 25 4
gpt4 key购买 nike

在 ES5 中,对数组进行子类化的简单方法(是的,我知道 length 问题)是 as follows :

function MyArray() {
[].push.apply(this, arguments)
}
MyArray.prototype = Object.create(Array.prototype)

const arr = new MyArray(1,2,3)
console.log(arr)

在构造函数中,人们怎么知道调用 push而不是调用 Array针对子类的构造函数(这不起作用)?

function MyArray() {
Array.apply(this, arguments)
}

这是直观的,还是有记录的,或者必须通过反复试验才能发现的东西?

最佳答案

调用[].push.apply(this,arguments)相当于调用this.push(...arguments)。因此,虽然看起来您将参数插入一个空数组,但实际上您将它们插入“您自己”,因为您“扩展”了数组原型(prototype) MyArray.prototype = Object.create(Array.prototype ) 从而实现“推送”功能。

function MyArray() {
this.push(...arguments)
}
MyArray.prototype = Object.create(Array.prototype)

const arr = new MyArray(1,2,3)
console.log(arr)

如果您改为调用Array.apply(this,arguments),您实际上是在创建一个包含“arguments”的新数组实例,而不是改变“您自己”。

function MyArray() {
const arr = Array.apply(this, arguments);
console.log('inner', arr);
}
MyArray.prototype = Object.create(Array.prototype)

const arr = new MyArray(1,2,3)
console.log('outer', arr)

编辑1:

Lets consider the normal case of const arr = Array(). In this case the value of this inside the Array function would be the global object. However we don't need anything from the global object in order to create a new instance of Array, so no methods (or variables) are accessed using this. In other words, the Array function will always produce a new instance, in the same way no matter what the value of this happens to be. (Implementation wise the Array function is actually native code, so this analogy only works in theory)

我们可以通过传入代理作为 this 参数来显示这一点,并记录与其的所有交互:

const loggingProxy = new Proxy({}, {
get(__, key) {
console.log('get', key);
return __[key];
},
set(__, key, value) {
console.log('set', key, value);
__[key] = value;
return true;
}
});

const arr = Array.apply(loggingProxy, [1, 2, 3]);
console.log(arr);

如您所见,没有记录“get”或“set”,因此 Array 函数没有访问 this 引用上的任何内容。

关于javascript - 在 JavaScript ES5 中对数组进行子类化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60846953/

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