gpt4 book ai didi

构造函数的 JavaScript prototype.constructor 属性不在规范中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:48:56 24 4
gpt4 key购买 nike

我在 JS spec 中找不到任何地方其中函数 - 当使用 new 调用时,应将其原型(prototype)的 constructor 属性设置为它们自己。

确定规范说内置构造函数(对象、数组、字符串等)都将它们的 prototype.constructor 属性设置为它们自己(即 Object.prototype.constructor = Object) 但我找不到任何地方说这必须/应该发生在其他构造函数上(似乎应该在 [[Construct]] 部分(13.2.2 [[Construct]]) 但它不是:

function F() {};
var obj = new F();
Object.getPrototypeOf(obj).constructor == F; // non-standard?? I can't find where in spec

我问是因为我看到很多代码将构造函数的 prototype.constructor 属性“重置”回自身——但这似乎是非标准的,因为这个属性首先指向构造函数?

function F() {};
F.prototype = new Parent();
F.prototype.constructor = F; // 'reset' it cuz it changed! (according to spec it should never have been set? Except in Object.prototype.

JS 程序员能否/应该依赖这种非标准(?)期望,即如果未设置原型(prototype)属性,构造函数的 prototype.constructor 属性将指向构造函数本身?

V8 肯定会这样做:

function F() {};
console.log(F.prototype.constructor === F); // true! WHY??? not in spec? Should be Object?

希望这能说得通 - 谢谢!! 标记

PS 由于它们的可变性,我只会依赖 instanceof 而不是使用 constructor 属性。

最佳答案

所有函数都具有指向对象的 .prototype 属性是标准的,该属性具有指向函数的 .constructor 属性。

13.2 Creating Function objects

1) Create a new native ECMAScript object and let F be that object.

...

16) Let proto be the result of creating a new object as would be constructed by the expression new Object() where Object is the standard built-in constructor with that name.

17) Call the [[DefineOwnProperty]] internal method of proto with arguments "constructor", Property Descriptor {[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}, and false.

18) Call the [[DefineOwnProperty]] internal method of F with arguments "prototype", Property Descriptor {[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}, and false.

所以你可以看到 F 是新函数而 proto 是原型(prototype)对象。 proto 获得一个指向 F"constructor" 属性,而 F 获得一个 "prototype " 指向 proto 对象的属性

关于构造函数的 JavaScript prototype.constructor 属性不在规范中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13749659/

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