在JavaScript/ActionScript中重新定义Math.constructor是否有任何实际用途?

Pau*_*tte 3 javascript constructor actionscript ecmascript-5 jscript

Math对象没有prototype属性,但具有构造函数属性.有没有重新定义构造函数有用的情况?

Poi*_*ars 6

Math对象(准确地说:对象通过的初始值称为MathECMAScript的全局对象的属性)的具有constructor属性,看到的ECMAScript语言规范,5.1版,第15.8节"Math对象".因此,

Math.hasOwnProperty("constructor")
Run Code Online (Sandbox Code Playgroud)

返回false(符合ECMAScript Ed.3及更高版本的实现).

Math对象通过原型链从其原型继承一个constructor属性,该原型是"标准的内置对象原型对象(15.2.4)"(同上),与该Object.prototype属性最初引用的相同.后一个对象提供了几个有用的属性,例如Object.prototype.hasOwnProperty(见上文).因此有意义的是,Math对象的原型链不是空的.

Math对象也继承Object.prototype.constructor仅仅是ECMAScript实现中无条件继承的副作用(除了版本4提议的实现,可能还有将来的版本)属性没有合适的可见性修饰符来防止这种情况(如private在几种基于类的语言中).当然,Object从同一原型继承的实例构造函数是Object全局对象属性的初始值引用的对象.所以Object.prototype.constructor必须反映这一点.因此,评估的结果

Math.constructor === Object
Run Code Online (Sandbox Code Playgroud)

true.


SLa*_*aks 5

所有对象都有一个constructor属性,表示创建该对象的构造函数.

甚至({}).constructor回报Object().

  • 请将其更改为"通常".你可以`删除Object.prototype.constructor`.此外,当使用`Constructor.prototype = {...}`设置原型时,`constructor`属性经常缺失/错误. (3认同)
  • @Bergi`delete Object.prototype.constructor`不是个好主意.但是,您可以创建一个具有空原型链的对象,因此不会继承任何属性.这样的对象作为数据容器很有用,因为几乎没有任何属性名称冲突的可能性.从版本5开始,这可以不使用专有的`__proto__`属性.例如,`Object.create(null).constructor`是`undefined`. (2认同)