首页 新闻 会员 周边

Function.prototype js

0
悬赏园豆:20 [已解决问题] 解决于 2014-01-13 22:46

最近在学习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 有什么作用?

HandyWang的主页 HandyWang | 初学一级 | 园豆:152
提问于:2014-01-12 18:55
< >
分享
最佳答案
1

Number是函数,可以说是数字类型的构造函数(也可以说是类),所以说数字都是Number类型的。Function是所有函数的构造函数。既然Number是函数,那它就算是Function构造函数(类)来实例化的实例,所以Function原型上添加的属性和方法,任何函数都继承了就可以调用了。

收获园豆:20
菜鸟前进中 | 菜鸟二级 |园豆:276 | 2014-01-12 22:39

谢谢回复啊,看看我的追问吧?还是有些不理解--

HandyWang | 园豆:152 (初学一级) | 2014-01-13 21:20

@王子的新衣: 首先要理解

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附加其他东西。

 

-----第一次回答问题,好紧张啊,有潜规则没啊,要不要脱啊..

菜鸟前进中 | 园豆:276 (菜鸟二级) | 2014-01-13 22:09

@菜鸟前进中: 多谢耐心回复!同是菜鸟,分都给你了,共勉!

HandyWang | 园豆:152 (初学一级) | 2014-01-13 22:46

@菜鸟前进中: 脱,一定得脱,哈哈~

幻天芒 | 园豆:37175 (高人七级) | 2014-01-13 23:14
其他回答(2)
0

typeof Number
"function"
typeof 1
"number"
首先你是在Function的原型上增加的函数,那么针对所有的function有效。而由于typeof Number==='function',所以可以调用test,如果是var i=1;i.test(1,2)的话,就会提示i没有test函数,因为i是基本类型number。

幻天芒 | 园豆:37175 (高人七级) | 2014-01-13 09:19

谢谢回复啊,看看我的追问吧?还是有些不理解--

支持(0) 反对(0) HandyWang | 园豆:152 (初学一级) | 2014-01-13 21:21

@王子的新衣: 额~貌似你已经明白了,哈哈~

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-01-13 23:14
0

所有的JavaScript类都是function。

function是类Function的对象,

所以typeof Number=="function" 的结果为true。

你添加了Function.prototype.test后,任何的function都可以调用test,所以Number.test是可以直接调用的。

乐享程序员 | 园豆:930 (小虾三级) | 2014-04-16 22:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册