Ang*_*usC 9 javascript ecmascript-5
鉴于ES 5.1标准规定......
1)在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.
Run Code Online (Sandbox Code Playgroud)
2)http://es5.github.com/#x15.3.5.2
NOTE Function objects created using Function.prototype.bind do not have
a prototype property.
Run Code Online (Sandbox Code Playgroud)
(这暗示所有其他功能都有)
...为什么内置函数不再具有原型属性?:
[].push.prototype; //undefined
Math.max.prototype; //undefined
Run Code Online (Sandbox Code Playgroud)
此外,即使为这些内置函数分配了一个原型属性,它们也不能用作构造函数:
[].push.prototype = {};
[].push.prototype; //[object Object]
new [].push(); //TypeError: function push() { [native code] } is not a constructor
Run Code Online (Sandbox Code Playgroud)
相反,从用户定义的对象中删除prototype属性仍然允许它用作构造函数,并且实际上将一个通用对象分配给生成的实例的[[prototype]]:
var A = function() {};
A.prototype = undefined;
A.prototype; //undefined
(new A()).__proto__; //[object Object]
Run Code Online (Sandbox Code Playgroud)
内置函数现在是子类型的构造函数还是函数?
[在大多数现代浏览器中测试]
它不是.prototype允许函数用作构造函数,而是[[Construct]]内部方法的存在.见本节第4步.
用户脚本创建的常规函数自动设置此内部属性,因此可以将所有用户函数作为构造函数调用.这是因为解释器无法知道用户打算如何使用该方法.
对于本机函数,预期的用法是预先知道的,因此javascript引擎可以决定哪些本机函数应该可以作为构造函数调用.调用是否有意义new [].push?
除非在特定函数的描述中另有规定,否则本节中描述的非构造函数的内置函数都不应实现[[Construct]]内部方法.除非在特定功能的描述中另有规定,否则本节中描述的任何内置函数都不应具有原型属性.
恕我直言,原因是没有有效的真实用例需要它.没有很好的解释为什么push要实例化:新的push和新的通用对象之间的区别是什么?因此,允许实例化这些函数不会给开发人员带来任何价值,但是会从其他人那里读取代码来引发大量的WTF.
| 归档时间: |
|
| 查看次数: |
744 次 |
| 最近记录: |