关于javascript的原型继承

经常会看到一个 

Array.prototype.slice.call(arguments);这样的用法。

对于prototype和call函数难以理解。无意中在一篇博客中看到这样一幅图,顿时明白了许多。


比如说通过function创建了一个函数Person,这个Person就是一个特殊的对象。假设Person有name和age属性。现在通过new操作创建一个对象

var man=new Person("xiaoming",20);

man是一个对象。而它与Person的区别是,Person对象有一个原型属性prototype,而man对象没有,prototype属性指向了一个prototype对象,同时prototype对象内有一个constructor属性,而这个constructor属性指向一个constructor对象,而这个对象就是function。

而在man对象中有一个内置原型属性,这个属性与Person的原型属性不同,这个属性假设称之为inobj,这个inobj属性是指向Person的prototype对象。所以man就可以去调用Person对象的属性和方法了。这就是传说中的原型继承。

var man=new Person("xiaoming",20);这一句话其实现的原理分为二步

1.var man={};定义man为一个对象。

2.Person.prototype.call(man,'xiaoming',20); 让man的内置原型属性去指向Person的prototype属性的prototype对象,这样man对象就可以去用Person对象的属性和方法了。

最后,我们再来看一下最开始的那句话

Array.prototype.slice.call(arguments);

是不是可以理解为:让arguments对象的内置原型属性去指向Array对象的propotype对象,这样arguments就有了数组对象的slice方法。等价于 ---> arguments.slice(0),为什么不直接用呢,因为arguments在函数传参的时候不是数组啊。

推荐一篇理解 Array.prototype.slice.call(arguments);的博客

:http://blog.csdn.net/i10630226/article/details/49702375  写的挺不错的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值