一.继承-通过原型实现继承

function Father() {
this.FatherSkin = "yellow";
};
Father.prototype.getFatherSkin = function () {
return this.FatherSkin;
};
function Son() {
this.SonSkin = "black";
};
// 继承: 子类原型等于父类的实例。
Son.prototype = new Father();
// 添加新的方法。
Son.prototype.getSonSkin = function () {
return this.SonSkin;
}
// 重写父类方法,重写父类方法并不会影响父类实例方法。
Son.prototype.getFatherSkin = function () {
return 'restSkin';
}
var son1 = new Son();
var father1 = new Father(); // console.log(son1 instanceof Son); // true
// console.log(son1 instanceof Father); // true
// console.log(son1.getFatherSkin); // 'restSkin'
// console.log(father1.getFatherSkin); // 'yellow' /*
原型实现继承的问题:
1.如果父类的构造函数中有引用类型的属性,那么子类继承后的实例属性会共享。
2.子类不能向父类的构造函数中传递参数。
*/
function Fruits() {
this.info = ['size', 'width'];
};
function Apple() { }; Apple.prototype = new Fruits(); var apple1 = new Apple();
var apple2 = new Apple();
apple1.info.push('height');
// apple1实例修改属性,会影响apple2实例。
// console.log(apple1.info); // ['size', 'width', 'height']
// console.log(apple2.info); // ['size', 'width', 'height']

二.继承-借用构造函数实现向父类传递参数

function Pi(age) {
this.age = age;
}; function Si() {
Pi.call(this, 20);
this.name = 'acfun';
}; var si1 = new Si();
// console.log(si1); // {age: 20, name: "acfun"} /*
借用构造函数的问题:
1.方法都在构造函数中,实例方法重载了。
2.因为没有把父类的实例赋给子类的原型,所以在父类原型中定义的方法,子类无法使用。
*/

三.继承-组合继承

function Phone(soc) {
this.soc = soc;
this.color = ['red', 'blue'];
}
Phone.prototype.getInfo = function () {
return `${this.soc},${this.color}`
}
function XiaoMi(soc, tag) {
Phone.call(this, soc);
this.tag = tag;
}
XiaoMi.prototype = new Phone();
XiaoMi.prototype.constructor = XiaoMi;
XiaoMi.prototype.getTag = function () {
return this.tag;
}; var mi1 = new XiaoMi('855', 'xm');
var mi2 = new XiaoMi('835', 'xm');
mi1.color.push('purple');
// console.log(mi1.getInfo()); // "855,red,blue,purple"
// console.log(mi2.getInfo()); // "855,red,blue" /*
优点:
1,通过构造函数修改了this指向,this指向了实例对象,所以父类构造函数上的属性即便是引用类型,也不存在共享的情况。
*/

插曲-原型式继承

// 浅复制
function createObj(o) {
function F() { };
F.prototype = o;
return new F();
};
var test1 = {
name: 'test',
opt: [1, 2, 3]
} var test2 = createObj(test1); // 相等 var test2 = Object.create(test1);
test2.opt.push(4);
// console.log(test2.opt); //  [1, 2, 3, 4]
// console.log(test1.opt); //  [1, 2, 3, 4]

四. 继承-寄生组合式继承

// 最理想的继承方式
var inheritPrototype = function (subType, superType) {
var prototype = superType.prototype;
prototype.constructor = subType;
subType.prototype = prototype;
} function Water(ml) {
this.ml = ml;
this.color = ['red', 'blue'];
}
Water.prototype.getInfo = function () {
return `${this.ml},${this.color}`
}
function MaiDong(ml, tag) {
Water.call(this, ml);
this.tag = tag;
}
inheritPrototype(MaiDong, Water); MaiDong.prototype.getTag = function () {
return this.tag;
}; var mai1 = new MaiDong('300', 'md');
var mai2 = new MaiDong('600', 'md');
mai1.color.push('purple');
// console.log(mai1.color); //  ["red", "blue", "purple"]
// console.log(mai2.color); //  ["red", "blue" ]

es6继承

class A {

}
class B extends A {
constructor() {
super()
}
}

三大步 go on

javascript 理解继承的更多相关文章

  1. 玩转JavaScript OOP[3]——彻底理解继承和原型链

    概述 上一篇我们介绍了通过构造函数和原型可以实现JavaScript中的“类”,由于构造函数和函数的原型都是对象,所以JavaScript的“类”本质上也是对象.这一篇我们将介绍JavaScript中 ...

  2. 彻底理解Javascript原型继承

    彻底理解Javascript原型继承 之前写过一篇Javascript继承主题的文章,这篇文章作为一篇读书笔记,分析的不够深入. 本文试图进一步思考,争取彻底理解Javascript继承原理 实例成员 ...

  3. 详解Javascript的继承实现(二)

    上文<详解Javascript的继承实现>介绍了一个通用的继承库,基于该库,可以快速构建带继承关系和静态成员的javascript类,好使用也好理解,额外的好处是,如果所有类都用这种库来构 ...

  4. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

  5. 再谈javascript原型继承

    Javascript原型继承是一个被说烂掉了的话题,但是自己对于这个问题一直没有彻底理解,今天花了点时间又看了一遍<Javascript模式>中关于原型实现继承的几种方法,下面来一一说明下 ...

  6. [转]Javascript原型继承

    真正意义上来说Javascript并不是一门面向对象的语言,没有提供传统的继承方式,但是它提供了一种原型继承的方式,利用自身提供的原型属性来实现继承.Javascript原型继承是一个被说烂掉了的话题 ...

  7. JavaScript 的继承与多态

    本文先对es6发布之前javascript各种继承实现方式进行深入的分析比较,然后再介绍es6中对类继承的支持以及优缺点讨论.最后介绍了javascript面向对象编程中很少被涉及的“多态”,并提供了 ...

  8. JavaScript(7)--- 继承

    JavaScript(7)--- 继承 概念 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承,继承也是为了数据共享. 之间有讲过j ...

  9. Javascript模拟继承(赠送.net吐槽一段)

    首先吐槽一句,今年的就业形势很不乐观啊,特别是搞.net的(相对java),特特别是还没出校门没有正式工作经验的,找个实习很难,前些天接了个面试电话,上来就质疑我“你一个在校大学生怎么可能做了那么多项 ...

随机推荐

  1. 钉钉机器人集成Jenkins推送消息模板自定义发送报告

    一.由于公司同样也使用了钉钉.那么在做Jenkins集成自动化部署的时候,也是可以集成钉钉的. 那种Jenkins下载钉钉插件集成,简单设置就可以完成了.我们今天要做的是,定制化的发送消息. 钉钉推送 ...

  2. PXE+Kickstart 批量安装CentOS 7

    安装之前 将需要安装 CentOS 的服务器与 PXE 服务器通过网络设备连接:PXE 服务器安装 CentOS,并且关闭firewalld.selinux,设置静态IP地址,本例设为10.0.0.1 ...

  3. 并发编程>>四种实现方式(三)

    概述 1.继承Thread 2.实现Runable接口 3.实现Callable接口通过FutureTask包装器来创建Thread线程 4.通过Executor框架实现多线程的结构化,即线程池实现. ...

  4. MyBatis学习笔记(一)创建第一个MyBatis项目

    一.新建Maven项目 http://www.mybatis.org/mybatis-3/zh/index.html 该链接为MyBatis官方地址 创建MyBatis项目主要有两种办法,一种是导入j ...

  5. 【性能测试】:关于loadrunner11录制Chrome浏览器脚本的方法

    有些web端的程序只能通过chrome访问,如果用lr11录制的话,会抓不到包, 现在教一种方法,可以抓到包的,主体思路就是设置代理,让报文流量绕道走一下 一,在LR中的设置: 从菜单Tools-Re ...

  6. [转] 遇见 TiDB - 分布式关系数据库

    [From] http://kuaibao.qq.com/s/20180510G0UFL000?refer=cp_1026 最近TiDB掀起了一波分布式数据库的热潮,公司也在着手准备TiDB的落地工作 ...

  7. mono for android 第三课--页面布局(转)

    对于C#程序员来说布局不是什么难事,可是对于我这个新手在mono for android 中布局还是有点小纠结的,不会没关系.慢慢学习.好吧我们开始简单的布局.在之前我们拖拽的控件都是自动的去布局,也 ...

  8. WCF系列教程之WCF操作协定

    一.简介 1.在定义服务协定时,在它的操作方法上都会加上OperationContract特性,此特性属于OperationContractAttribute 类,将OperationContract ...

  9. python-TCP模拟ftp文件传输

    #!/usr/bin/python #coding=utf-8 #server from socket import* import sys,os def command(): l=[ "W ...

  10. 解决SSH连接linux时长时间不操作自动断开

    最近重装Linux系统,但是这次ssh连接云服务区Linux系统时,经常出现一段时间不操作,连接自动中断,表现为光标还在闪动,但是却无法操作.只好关闭终端,重新连接,很是麻烦. 为此,通过网络查找,找 ...