增加类型,找不到方法

时间:2013-10-13 10:03:38

标签: javascript

我正在尝试“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]}没有方法'integer'

我不确定我哪里出错了。

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

2 个答案:

答案 0 :(得分:1)

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

因此,要使用它,请在Number实例上调用该方法,如下所示:Live Example | Live Source

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

或使用数字文字:Live Example | Live Source

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

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


附注:扩展具有可枚举属性的预定义类型的原型可能有点危险。当人们延长NumberString时,我从未见过任何重大问题,但如果您延长ArrayObject,则会出现主要的问题,所以我会远离那样做。


附注2:在上面的示例中,我还更正了Math.ceil的名称(ceil,而不是ceiling)。

答案 1 :(得分:1)

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

代码中存在两个问题:

  1. 您正在调用integer,就好像它是在类或构造函数Number本身上定义的那样,并非如此,它是在Number的原型上定义的。如果函数实际上是在Number本身上定义的,那么它将被定义为:

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

  3. 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());