最近在学习js面向对象,遇到些小困惑,各位大神帮帮忙吧,直接上代码:
Function.prototype.test = function (name, func) {
this.prototype[name] = func;
return this;
};
Number.test('integer', function () {
return Math[this < 0 ? 'ceil' : 'floor'](this);
});
document.writeln((10 / 3).integer());//-3
Number不是js中的数据类型吗?为什么Function.prototype添加test属性后,Number也能调用了?Function就是指所有的方法(function)吗?
而且跟踪发现typeof Number是function,这点我也不明白
再追问一下,
this.prototype[name] = func;
return this;
1>改成this[name] = func;为何不行?就是直接给Number添加integer方法--
2>return this 有什么作用?
Number是函数,可以说是数字类型的构造函数(也可以说是类),所以说数字都是Number类型的。Function是所有函数的构造函数。既然Number是函数,那它就算是Function构造函数(类)来实例化的实例,所以Function原型上添加的属性和方法,任何函数都继承了就可以调用了。
谢谢回复啊,看看我的追问吧?还是有些不理解--
@王子的新衣: 首先要理解
Function.prototype.test = function (name, func) {
this.prototype[name] = func;
return this;
};
中this指的是哪个。后面Numbe.test这样调用时,this指的Number这个函数。而在test函数的实现中this.prototype又指的哪个?首先,如果Number这里仍做为一个实例的话,它是不能直接持有它的原型的引用(一般可以看到是_proto_这样的)。既然它不能作为一个实例持有原型的话,只有作为构造函数持有它代表的这个类的原型,this.prototype[name]=func是让这个Number构造函数的实例都拥有这个方法(即这些数字都有了这个方法)。如果this[name]=func的就是让这个函数有这个方法了(这里函数是作为对象)。你可以改为this[name]=func运行,你可以发现通过Number.integer可以掉用你后面附加上的方法。
后面return this,这个一般作为链式语法,jquery那样,可以连着调用。在你这里用处不大,当然你可以在刚才那调用了Test那里接着给Number附加其他东西。
-----第一次回答问题,好紧张啊,有潜规则没啊,要不要脱啊..
@菜鸟前进中: 多谢耐心回复!同是菜鸟,分都给你了,共勉!
@菜鸟前进中: 脱,一定得脱,哈哈~
typeof Number
"function"
typeof 1
"number"
首先你是在Function的原型上增加的函数,那么针对所有的function有效。而由于typeof Number==='function',所以可以调用test,如果是var i=1;i.test(1,2)的话,就会提示i没有test函数,因为i是基本类型number。
谢谢回复啊,看看我的追问吧?还是有些不理解--
@王子的新衣: 额~貌似你已经明白了,哈哈~
所有的JavaScript类都是function。
function是类Function的对象,
所以typeof Number=="function" 的结果为true。
你添加了Function.prototype.test后,任何的function都可以调用test,所以Number.test是可以直接调用的。