4

我在JS 规范中找不到函数的任何地方 - 调用时new应该将constructor其原型的属性设置为自己。

当然规范说内置构造函数(对象,数组,字符串,&c)都将它们的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.constructor 属性将指向构造函数本身?

V8 肯定会这样做:

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

希望这有模糊的意义 - 谢谢!标记

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

4

1 回答 1

4

所有函数都有一个.prototype指向对象的.constructor属性和一个指向函数的属性是标准的。

13.2 创建函数对象

1) 创建一个新的原生 ECMAScript 对象并让其F成为该对象。

...

16) 令 proto 为创建新对象的结果,这将由表达式构造,new Object()其中 Object 是具有该名称的标准内置构造函数。

17)使用 arguments 、 Property Descriptor和 false调用[[DefineOwnProperty]]proto 的内部方法。"constructor"{[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}

18) 调用with arguments 、Property Descriptor和false的[[DefineOwnProperty]]内部方法。F"prototype"{[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}

所以你可以看到F是新函数并且proto是原型对象。proto获取"constructor"指向 的属性,FF获取"prototype"指向proto对象的属性

于 2012-12-06T18:08:15.637 回答