我正在阅读“Javascript the Good Parts”一书,并尝试了一些例子来理解这些概念。我遇到了一个例子,无法理解。请查看下面的代码,让我了解我的错误:
//Augmenting the Function prototype with method
Function.prototype.method = function(name, func){
if (typeof this.prototype[name] !== "function"){
this.prototype[name]=func;
return this;
}
}
// why do we have the (this) at the end of the return statement.
/*Number.method("integer", function(){
return Math[this < 0 ? 'ceil': 'floor'](this);
});*/
//According to me the function should have been like below:
Number.method("integer", function(val){ // we get a function and we need to pass the value and the value will be evaluated and returned.
return Math[val < 0 ? 'ceil': 'floor'];
});
//According to my understanding the calling function should be something like below.
alert((-10/3).integer(-10/3);
我知道我的方法不起作用,但很难找到理由。请用一些例子来更新我以强化概念。
分享小提琴的链接 - Fiddle - link
答案 0 :(得分:1)
根据我的理解,调用函数应该类似于
(-10/3).integer(-10/3)
这就是你误解的地方。你为什么要重复这个号码?不,方法应该被称为
(-10/3).integer() // -3
没有任何参数 - 它所处理的值是Number
实例(方法中的this
)。
如果您要将数字作为参数传递,则不需要将其作为方法,而应该是静态函数:
Number.integer = function(val) {
return Math[val < 0 ? 'ceil': 'floor'](val);
// ^^^ still passing it here, of course
};
Number.integer(-10/3) // -3
这也是可行的,特别是当参数不能保证为数字时,各种静态Number
和Math
函数都可以看出。
答案 1 :(得分:1)
Math[val < 0 ? 'ceil': 'floor']
是一个功能。考虑Math.ceil
或Math.floor
。
因此,您添加到Number
的方法将返回函数而不是值。
虽然在行的末尾添加(this)
将使用caller的值调用此函数,在您的情况下为-10/3。因此它会将预期值返回给您。