1

我正在尝试“Java Script the Good Parts”一书中的一个例子。在代码下方找到。

它抛出一个错误,说 Number 没有方法整数。你能帮我理解这个问题吗?

Function.prototype.method = function (name, func) {
    this.prototype[name] = func;
    return this;
};

Number.method('integer', function () {
    return Math[this < 0 ? 'ceiling' : 'floor'](this);
});

运行上述代码后,它会将方法整数附加到 Number.prototype

Number.prototype.integer

它显示功能。

Number.integer

它说未定义。

Number.integer(10);

我得到 - Number() { [native code] } 没有方法“整数”

我不确定我哪里出错了。

我尝试用天花板替换天花板。它仍然不起作用。

4

2 回答 2

1

您将方法添加到分配给Number 实例的原型中,而不是将其添加到Number函数本身。

因此,要使用它,您可以在 的实例上调用该方法Number,如下所示:Live Example | 直播源

var n = 3.1415;
var i = n.integer();
console.log("i = " + i); // "i = 3"

或使用数字文字:Live Example | 直播源

console.log(3.1415.integer()); // "3"
console.log((3).integer());    // "3"

请注意,在上面的第二行中,我必须将3其单独放在括号中;否则,JavaScript 解析器认为.是小数点而不是属性访问器。


旁注:使用可枚举属性扩展预定义类型的原型可能有点危险。Number当人们扩展or时,我从未见过任何重大问题String,但是如果您扩展or ,则会出现重大问题,所以我不会这样做。ArrayObject


旁注 2:在上面的示例中,我还更正了Math.ceil(it's ceil, not ceiling) 的名称。

于 2013-10-13T10:05:08.167 回答
1

添加到原型中的method函数(取自 Javascript the Good Parts)Function可帮助您在给定类或类型上定义方法,以便该类型的所有实例或对象继承该方法。

您的代码中有两个问题:

  1. 您正在调用integer它,就好像它是在类或构造函数Number本身上定义的一样,但事实并非如此,它是在Number. 如果该函数实际上是在Number其自身上定义的,它应该是这样定义的:

    Number.integer = function() { /* Implementation */ };
    
  2. 您正在将参数传递给函数(ie Number.integer(10)),尽管在函数体中您没有处理该数字,也没有声明该integer函数接受任何参数。我猜你很困惑,这个数字是由this函数内部的关键字引用的,但这是不正确的。

method函数允许您在给定类型上定义一个方法,您可以像这样从中受益:

var a = 10.3; // Now a is a Number instance and so it inherits the integer() method
console.log(a.integer()); // call the method on a

您甚至可以直接在文字上调用它,它们将由解释器自动包装,如下所示:

console.log((32.543).integer());
于 2013-10-13T10:06:57.197 回答