JavaScript:扩充类型

时间:2016-02-23 09:46:16

标签: javascript

我正在阅读JavaScript:好的部分,并在下面找到了示例。我试图改变给定的例子,但得到了一个错误。 这有效:

Function.prototype.method = function(name, func){
    this.prototype[name] = func;
  return this;
}
Number.method("add", function(a, b){
    console.log(a+b);
});
var a = new Number();
a.add(2,2);

输出:

4

但以下一个不是:

Number.prototype.method = function(name, func){
    this.prototype[name] = func;
  return this;
}
Number.method("add", function(a, b){
    console.log(a+b);
});
var a = new Number();
a.add(2,2);

输出:

Uncaught TypeError: Number.method is not a function

请帮助。提前致谢。 enter image description here

3 个答案:

答案 0 :(得分:1)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/prototype

Writable        no
Enumerable      no
Configurable    no

基本上你只是跳过原型而没有它,因为NumberFunction的一个实例。这就是你可以做Function.prototype.method的原因!这样做:



Number.method = function(name, func) {
    this.prototype[name] = func;
    return this;
}
Number.method("add", function(a, b) {
    document.write(a + b);
});
var a = new Number();
a.add(2, 2);




答案 1 :(得分:1)

Number是Function的一个实例,因此它委托给Function的原型。

在您的修改后的版本中,您向method添加了Number.prototype,而不是Number - 这是一个构造函数。

因此您尝试呼叫的Number.method不存在。

为了实现这一点,您需要将第一行Number.prototype.method更改为Number.method

答案 2 :(得分:1)

你可以这样使用

Number.prototype.method = function(name, func){
    this.__proto__[name] = func;
  return this;
}
var a = new Number();
a.method("add", function(a, b){
    console.log(a+b);
});
a.add(2,2)