JavaScript 原型总结六 继承

1.为什么用“继承”为标题,而不用“原型链”?

原型链若是解释清楚了很容易理解,不会与经常使用的java/C#产生混淆。而“继承”确实经常使用面向对象语言中最基本的概念,可是java中的继承与javascript中的继承又彻底是两回事儿。所以,这里把“继承”着重拿出来,就为了体现这个不一样。javascript

javascript中的继承是经过原型链来体现的。先看几句代码java

以上代码中,f1是Foo函数new出来的对象,f1.a是f1对象的基本属性,f1.b是怎么来的呢?——从Foo.prototype得来,由于f1.__proto__指向的是Foo.prototypeweb

访问一个对象的属性时,先在基本属性中查找,若是没有,再沿着__proto__这条链向上找,这就是原型链。微信

看图说话:app

上图中,访问f1.b时,f1的基本属性中没有b,因而沿着__proto__找到了Foo.prototype.b。函数

那么咱们在实际应用中如何区分一个属性究竟是基本的仍是从原型中找到的呢?你们可能都知道答案了——hasOwnProperty,特别是在for…in…循环中,必定要注意。spa

等等,不对! f1的这个hasOwnProperty方法是从哪里来的? f1自己没有,Foo.prototype中也没有,哪儿来的?prototype

它是从Object.prototype中来的,请看图:对象

对象的原型链是沿着__proto__这条线走的,所以在查找f1.hasOwnProperty属性时,就会顺着原型链一直查找到Object.prototype。继承

说一个函数的例子吧。

咱们都知道每一个函数都有call,apply方法,都有length,arguments,caller等属性。为何每一个函数都有?这确定是“继承”的。函数由Function函数建立,所以继承的Function.prototype中的方法。不信能够请webstrom老师给咱们验证一下:

看到了吧,有call、length等这些属性。

那怎么还有hasOwnProperty呢?——那是Function.prototype继承自Object.prototype的方法。有疑问能够看看上一节将instanceof时候那个大图,看看Function.prototype.__proto__是否指向Object.prototype。

原型、原型链,你们都明白了吗?能够关注个人微信订阅号

相关文章
相关标签/搜索