为什么内置函数没有原型属性?

2023-12-22

鉴于 ES 5.1 标准规定...

1)脚注http://es5.github.com/#x13.2 http://es5.github.com/#x13.2

NOTE A prototype property is automatically created for every function,
to allow for the possibility that the function will be used as a constructor.

2) http://es5.github.com/#x15.3.5.2 http://es5.github.com/#x15.3.5.2

NOTE Function objects created using Function.prototype.bind do not have
a prototype property.

(这意味着所有其他功能都是如此)

...为什么内置函数不再具有原型属性?:

[].push.prototype; //undefined
Math.max.prototype; //undefined

此外,即使为这些内置函数分配了原型属性,它们也不能用作构造函数:

[].push.prototype = {};
[].push.prototype; //[object Object]
new [].push(); //TypeError: function push() { [native code] } is not a constructor

相反,从用户定义的对象中删除原型属性仍然允许将其用作构造函数,并且实际上将通用对象分配给生成的实例的[[prototype]]:

var A = function() {};
A.prototype = undefined;
A.prototype; //undefined
(new A()).__proto__; //[object Object]

内置函数现在是否被子类型化为构造函数或函数?

[在大多数现代浏览器中测试]


这不是.prototype允许将函数用作构造函数,但是存在[[Construct]] http://es5.github.com/#x13.2.2内部方法。看本节 http://es5.github.com/#x11.2.2, 步骤4。

用户脚本创建的普通函数会自动设置此内部属性,因此所有用户函数都可以作为构造函数调用。这是因为解释器无法知道用户打算如何使用该方法。

对于本机函数,预期用途是预先知道的,因此 javascript 引擎可以决定哪些本机函数应该作为构造函数进行调用。调用有意义吗new [].push?

中提到了内置对象的介绍部分 http://es5.github.com/#x15 that:

除非在特定函数的描述中另有规定,否则本节中描述的非构造函数的内置函数都不应实现 [[Construct]] 内部方法。除非在特定函数的描述中另有规定,否则本节中描述的任何内置函数都不应具有原型属性。

恕我直言,原因是没有有效的实际用例需要它。没有很好的解释为什么push应该是可实例化的:新的和新的有什么区别push和一个新的通用对象?因此,允许实例化这些函数不会给开发人员带来任何价值,但会带来很多好处WTFs http://www.osnews.com/images/comics/wtfm.jpg来自阅读代码的其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么内置函数没有原型属性? 的相关文章

随机推荐