我无法在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
属性。
答案 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"
属性