不在规范中的构造函数的JavaScript prototype.constructor属性?
我在where函数中找不到任何地方-当使用不在规范中的构造函数的JavaScript prototype.constructor属性?,javascript,constructor,ecmascript-5,Javascript,Constructor,Ecmascript 5,我在where函数中找不到任何地方-当使用new调用时,应该将其原型的构造函数属性设置为自己 当然,规范中说内置构造函数(对象、数组、字符串和c)都将prototype.constructor属性设置为自己的属性(即Object.prototype.constructor=Object),但我找不到任何地方说其他构造函数必须/应该这样做(似乎应该在[[Construct]]中详细说明)节(13.2.2[[Construct]]),但它不是: function F() {}; var obj =
new
调用时,应该将其原型的构造函数
属性设置为自己
当然,规范中说内置构造函数(对象、数组、字符串和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属性,构造函数的prototype.constructor属性将指向构造函数函数本身
V8确实做到了这一点:
function F() {};
console.log(F.prototype.constructor === F); // true! WHY??? not in spec? Should be Object?
希望这有点含糊不清-谢谢!!
标记
PS由于其易变性,我将只依赖
instanceof
,而不使用构造函数
属性。所有函数都有一个.prototype
属性,该属性指向具有指向函数的.constructor
属性的对象
1) 创建一个新的本机ECMAScript对象,并让F
成为该对象
16) 假设proto是创建一个新对象的结果,该对象将由表达式newobject()
构造,其中object是具有该名称的标准内置构造函数
17) 使用参数“构造函数”
、属性描述符{[[Value]]:F、{[[Writable]]:true、[[Enumerable]]:false、[[Configurable]]:true}
和false调用proto的[[DefineOwnProperty]]]
内部方法
18) 使用参数“prototype”
、属性描述符{[[Value]]:proto、{[[writeable]]:true、[[Enumerable]]:false、[[Configurable]]:false}
和false调用[[DefineOwnProperty]]]
的内部方法
因此,您可以看到F
是新函数,proto
是原型对象。proto
获得一个指向F
的构造函数属性,而F
获得一个原型
指向proto
对象的属性我认为最好的做法是将构造函数全部丢弃,并使用object.create和.isPrototypeOf.You是对的,[[construct]]
(关键字new
)不设置构造函数属性。相反,它是从使用函数创建的默认原型对象继承而来的,请查看dun Thank ~!!!dunno我怎么错过了…@user1883202:不客气,仅供参考,我刚刚修复了我答案中的第一句话,这句话措词不当。