构造函数的JavaScript prototype.constructor属性不符合规范?

时间:2012-12-06 17:58:53

标签: javascript constructor ecmascript-5

我无法在JS spec中的任何位置找到函数 - 使用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

我问,因为我看到很多代码'重置'构造函数'back'到自身的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属性如果未设置prototype属性将指向构造函数本身吗?

V8肯定会这样做:

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

希望模糊不清 - 谢谢!!    标记

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

1 个答案:

答案 0 :(得分:4)

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

13.2 Creating Function objects

  

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

     

...

     

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

     

17)使用参数[[DefineOwnProperty]],属性描述符"constructor"和false调用proto的{[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}内部方法。

     

18)使用参数[[DefineOwnProperty]],属性描述符F和false来调用"prototype" {[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}的内部方法。

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