gpt4 book ai didi

JavaScript Object.defineProperty 没有按预期工作

转载 作者:行者123 更新时间:2023-11-30 14:07:37 25 4
gpt4 key购买 nike

我错误地使用了 Object.defineProperty 传递一个函数作为它的描述符参数,就像吹代码一样:

let fakeDesc = () => {}
let obj = {
method1: function() {
console.log('this is method1');
}
};
Object.defineProperty(obj, 'method1', fakeDesc);
obj.method1();

代码评估结果是method1没有被覆盖。

根据 MDN 文档( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty )

If a descriptor has neither of value, writable, get and set keys, it is treated as a data descriptor.

所以我认为 fakeDesc 应该像数据描述符一样对待,默认的 value 属性应该是 undefined,所以上面代码将导致 obj.method1 等于 undefined

这种情况呢?是否有一些文件可以解释这个问题?

最佳答案

传递的描述符(第三个参数)应该是一个普通对象,具有valuewritable 等属性。如果您传递一个函数而不是一个对象,它会被忽略。

A data descriptor is a property that has a value, which may or may not be writable.

如果您传递函数,则不会传递数据描述符。

如果您传递一个带有 fakeDescvalue 属性的对象,它将按预期工作:

let fakeDesc = () => {}
let obj = {
method1: function() {
console.log('this is method1');
}
};
Object.defineProperty(obj, 'method1', { value: fakeDesc });
obj.method1();

当您传递一个没有value 属性的对象时,基础值不会改变,尽管该属性的描述符 可能会改变。例如,以下将 method1 上的 enumerable 更改为 false,尽管没有更改基础值(this is method1功能):

let obj = {
method1: function() {
console.log('this is method1');
}
};
console.log(Object.getOwnPropertyDescriptor(obj, 'method1'));
Object.defineProperty(obj, 'method1', { enumerable: false });
console.log(Object.getOwnPropertyDescriptor(obj, 'method1'));

我想你可以技术上传递一个函数并让它改变描述符,但是你必须直接在函数上设置一个属性,这真的很奇怪:

const fakeFn = () => {};
fakeFn.enumerable = false;
let obj = {
method1: function() {
console.log('this is method1');
}
};
console.log(Object.getOwnPropertyDescriptor(obj, 'method1'));
Object.defineProperty(obj, 'method1', fakeFn);
console.log(Object.getOwnPropertyDescriptor(obj, 'method1'));
obj.method1();

当 MDN 说不同键(如 configurableenumerable)的默认值为 false 时,valuefalse,它指的是 当您创建对象上尚不存在的属性时 的过程。该过程在 DefineOwnProperty 中定义.

关于JavaScript Object.defineProperty 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55096737/

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