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

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. 第一个PSP0级

    1.计划: 需求描述: 按照图片要求设计添加新课程界面.(0.5分) 在后台数据库中建立相应的表结构存储课程信息.(0.5分) 实现新课程添加的功能. 要求判断任课教师为王建民.刘立嘉.刘丹.王辉.杨 ...

  2. 51.RocketMQ 顺序消费

    大部分的员工早上的心情可能不会很好,因为这时想到还有很多事情要做,压力会大点,一般到下午4点左右,状态会是一天中最好的,因为这时大部分的工作做得差不多了,又快要下班了,当然也不是绝对.要注意记录各下属 ...

  3. pytest+jenkins安装+allure导出报告

    环境安装: windows7+64位 pytest:4.0.2 allure的安装:allure的python库pytest-allure-adaptor jenkins的安装:2.138.2 JDK ...

  4. docker 磁盘清理 相关

    用户在使用 Docker 部署业务一段时间后,可能会发现宿主节点的磁盘容量持续增长,甚至将磁盘空间耗尽进而引发宿主机异常,进而对业务造成影响. 本文先对 Docker 的空间分析与清理进行说明,然后对 ...

  5. spark 广播变量

    Spark广播变量 使用广播变量来优化,广播变量的原理是: 在每一个Executor中保存一份全局变量,task在执行的时候需要使用和这一份变量就可以,极大的减少了Executor的内存开销. Exe ...

  6. Monkey and Banana

    Monkey and BananaTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  7. c# 操作excle

    添加引用  Microsoft.Office.Interop.Excel; 添加命名空间 using Excel = Microsoft.Office.Interop.Excel; //创建接口变量- ...

  8. Java网络编程(一)

    Java网络编程: 1.1: 网络编程:对于我这个“研究不深”的网络菜鸟来说,我觉得网络编程就是实现计算机与计算机之间通信的编程.写些能够实现计算机与计算机之间的通信就行了(目前来说). 1.2:一台 ...

  9. Linux网络编程--多线程实现echo服务器与客户端“一对多”功能,是网络编程的“Hello World!”

    在linux平台下,用多线程实现echo服务器与客户端“一对多”(即是一台服务器可以响应多个客户端的请求).本人写了个demo,和大家一起分享,有不足的地方,请多多指教,我是壮壮熊. 编译时,在后面加 ...

  10. python实例:在列表,字典,集合中,根据条件筛选数据

    1. 从列表中过滤掉 负数 from random import randint # 随机生成列表 data = [randint(-10, 10) for _ in range(10)] print ...