我正在尝试“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替换天花板。它仍然不起作用。
答案 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解析器认为.
是小数点而不是属性访问器。
附注:扩展具有可枚举属性的预定义类型的原型可能有点危险。当人们延长Number
或String
时,我从未见过任何重大问题,但如果您延长Array
或Object
,则会出现主要的问题,所以我会远离那样做。
附注2:在上面的示例中,我还更正了Math.ceil
的名称(ceil
,而不是ceiling
)。
答案 1 :(得分:1)
您要添加到method
原型的Function
函数(取自Javascript the Good Parts)可帮助您定义给定类或类型的方法以便该类型的所有实例或对象都继承该方法。
代码中存在两个问题:
您正在调用integer
,就好像它是在类或构造函数Number
本身上定义的那样,并非如此,它是在Number
的原型上定义的。如果函数实际上是在Number
本身上定义的,那么它将被定义为:
Number.integer = function() { /* Implementation */ };
您正在将参数传递给函数(即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());