Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不在规范中的构造函数的JavaScript prototype.constructor属性?_Javascript_Constructor_Ecmascript 5 - Fatal编程技术网

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

不在规范中的构造函数的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 =

我在where函数中找不到任何地方-当使用
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:不客气,仅供参考,我刚刚修复了我答案中的第一句话,这句话措词不当。