【问题标题】:Reassigning prototypes of build-in types重新分配内置类型的原型
【发布时间】:2013-05-27 14:23:52
【问题描述】:
Number.prototype=
{  
    constructor:Number
    min:10,
    max:15
};
var obj=new Number();
alert(obj.min);

在这里,我为默认的Number 构造函数创建了一个新原型。 然后创建Number 的新实例并将其存储在obj 中。 由于我在原型分配之后创建了一个实例,因此我希望 obj.min 将返回 10 但它正在返回 undefined

我假设因为新创建的Number.prototype 的构造函数属性指向同一个Number 构造函数,所以实例obj[PROTOTYPE] 属性指向新创建的原型。

我认为问题在于假设,obj[PROTOTYPE] 属性指向原始默认原型。

【问题讨论】:

  • 您在“数字”之后忘记了逗号;)
  • 根据规范,Number.prototype 是只读的:es5.github.io/#x15.7.3.1。 @Andre:一定是帖子中的错字,否则alert 永远不会被执行。

标签: javascript oop object prototype


【解决方案1】:

ECMAScript 定义的核心类型的原型属性(ObjectNumberBooleanArrayStringFunctionErrorRegExp)是只读的,你不能用你自己的来代替它。

但你可以扩展它:

Number.prototype.min = 5;

【讨论】:

  • @chetanmehta:在 Chrome 上不正确。 tinker.io/c3d8b 。它们可以扩展——但是浏览器定义的函数不能被替换。
  • @SébastienRenauld 您没有替换函数中的原型。
  • 因为我在 Object.getOwnPropertyNames 中没有发现任何神秘的道具
  • @chetanmehta:只有一个设置可以使属性变为只读。这就是writeable 设置,并且规范清楚地将Number.prototype 定义为writeable:false。要查看它,请使用Object.getOwnPropertyDescriptor(Number, "prototype")
  • 我不知道为什么这被否决了,因为这至少解释了为什么 OP 的代码不起作用。但是,为了提供解决方案,也许您可​​以添加扩展原型是可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2015-12-24
  • 1970-01-01
  • 2011-11-04
  • 2018-06-12
  • 2012-02-04
  • 1970-01-01
相关资源
最近更新 更多