前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >《你不知道的JavaScript》:拎清原型继承的原理

《你不知道的JavaScript》:拎清原型继承的原理

作者头像
前端_AWhile
发布2019-08-29 13:12:38
2680
发布2019-08-29 13:12:38
举报
文章被收录于专栏:前端一会前端一会

虽然在js中没有类,构造函数本质上也只是一个普通函数,new关键字调用一个构造函数来创建一个新对象,也是js在努力模仿面向对象语言中类new对象的实现,这个模仿过程也对开发者造成很大误导,但不能否认的是也降低了理解的门槛,在初期快速上手阶段还是很有帮助的。

至少我刚开始不是很明白js的原型链时,就是按照面向对象的类思路来写的,并且在js中也都可以实现js版的类、实例对象、成员属性、成员方法、继承、多态和封装,所以其实就当个面向对象的语言来写,在初期也是没什么问题的。但是在慢慢理解js与面向对象语言的区别后,虽然还是正常使用这些面向对象的标准概念,但本质还是要分清的,这对于迈向js精通是绝对必要。

上篇讲的是js的构造函数,也涉及到js的原型,而要想原型发挥作用,就必须要有个原型继承来承接:

代码语言:javascript
复制
1function Foo(name){
2    this.name = name;
3};
4Foo.prototype.showName = function(){
5    console.log(this.name)
6}
7var obj = new Foo("nitx");
8obj.showName();     // nitx

对象obj就是通过原型继承来关联到Foo.prototype对象的。

那么上述实现过程用到原型继承,还有什么场景需要用到原型继承呢?

就是面向对象中的继承步骤。

js版的继承其实就是通过原型继承来关联到“父类”的,看下面代码示例:

代码语言:javascript
复制
 1function Foo(name){
 2    this.name = name;
 3}
 4Foo.prototype.showName = function(){
 5    console.log(this.name);
 6}
 7function Bar(name, age){
 8    Foo.call(this, name);
 9    this.age = age;
10}
11Bar.prototype = Object.create(Foo.prototype);   // 这行代码是实例子类继承父类的关键
12Bar.prototype.showAge = function(){
13    console.log(this.age);
14}
15var b = new Bar("nitx", 30);
16b.showName();       // nitx
17b.showAge();        // 30

上例用面向对象的概念解释就是子类Bar继承父类Foo,

但js版的理解是这样子的:注意看,Foo函数的原型对象通过Object.create()方法创建一个新对象,这个新对象的[[Prototype]]属性指向Foo.prototype对象,并且通过赋值操作符来修改Bar.prototype这个标识符原本指向的对象,改为指向刚才新创建的对象。所以这个过程,就把Bar函数原有的Bar.prototype对象给抛弃掉了。

所以这步操作的作用就是原型继承。至于Bar函数中的Foo.call(this, name);,就是通过call关键字将Foo函数内的this对象绑定到Bar函数内的this对象上,从而借用Foo函数内作用域的执行代码为Bar函数执行时所用。这样就完成了一个模拟类继承的过程。

不得不说,这是一个天才般的设计,再次为Brendan Eich点个赞,上柱香,拜一拜~~~~

所以ES6中的class继承,其核心实现原理就是这样差不多,只是通过语法糖,来使之写起来和java面向对象写法一样,唔,但自己心里也拎的清,这个class就是样子货罢了,不受你迷惑,不受你迷惑,不受你迷惑…

-------------------------------- 热门文章 --------------------------------

设计模式>>>

javascript设计模式一: 单例模式

javascript设计模式二:策略模式

javascript设计模式三:代理模式

javascript设计模式四:迭代器模式

javascript设计模式五:原型模式

javascript设计模式六:发布-订阅模式(观察者模式)

javascript设计模式七:模板方法模式

javascript设计模式八:职责链模式

javascript设计模式九:中介者模式

javascript设计模式十:装饰者模式

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档