gpt4 book ai didi

javascript - 更改 [].__proto__.constructor 和 [].constructor 差异的行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:05 25 4
gpt4 key购买 nike

我目前正在尝试理解 javascript 中的 constructor 属性。

请注意,我知道应该避免更改内置函数的属性,我正在尝试它是因为我想更好地理解基本原理。

我试图更改 [] 的默认 constructor 属性(即数组对象的默认构造函数)

[].__proto__.constructor === [].constructor; // true 

[].constructor = function A(){}; // attempts to reset the constructor property to a new function

[].constructor; // prints ƒ Array() { [native code] }, which indicate the attempt failed

但是当我检查[].constructor的属性描述符时

Object.getOwnPropertyDescriptor([].__proto__, 'constructor');

打印

{value: ƒ, writable: true, enumerable: false, configurable: true}

所以 [].__proto__.constructor 属性是可写

所以我尝试通过[].__proto__设置constructor属性,成功了

[].__proto__.constructor = function B(){};

[].__proto__.constructor; // prints: ƒ B(){}, which indicate the attempt succeded

为什么通过 [] 更改 constructor 属性失败但通过 [].__proto__ 成功?尽管 [].constructor === [].__proto__.constructor 返回了 true

最佳答案

这是由于原型(prototype)链上的属性阴影。当你执行

[].constructor = ...;

这会在数组上创建一个实例属性,隐藏 类原型(prototype)构造函数。但是,由于 Array.prototype 已经有自己的 constructor 属性,执行

[].__proto__.constructor = ...;

覆盖 Array.prototype 上的构造函数。

您可以通过实际存储数组实例并仔细查看其原型(prototype)链来确认此行为:

enter image description here

下面验证赋值实际上在 array1 上创建了一个自己的属性,它隐藏了从 Array.prototype 继承的属性。

function A(){}

var array1 = [];

array1.constructor = A;

console.log(array1.constructor === A);
console.log(array1.__proto__.constructor === Array);

关于javascript - 更改 [].__proto__.constructor 和 [].constructor 差异的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55410862/

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