一、总结:

//js中的几种继承
//原型链的问题,包含引用类型的原型属性会被实例共享,子类型无法给超类型传递参数
function SuperType() {
this.colors = ["red","blue","green"];
} function SubType() {
} SubType.prototype = new SuperType();
var instance1 = new SubType();
instance1.colors.push("black");
//alert(instance1.colors);//red,blue,green,black
var instance2 = new SubType();//red,blue,green,black
//alert(instance2.colors);

  

//1.借用构造函数
//在构造函数中定义属性,而不是在原型对象中定义属性
function SuperType() {
this.colors = ["red","blue","green"];
function getColors() {
return colors;
}
} function SubType() {
//每个实例都会有一个colors属性的副本
SuperType.call(this);//构造函数中继承了SuperType
} //SubType.prototype = new SuperType();
//SuperType.prototype.getColors = function() {
// return this.colors;
//};
var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors);//red,blue,green,black
//alert(instance1.getColors());//red,blue,green,black
var instance2 = new SubType();
alert(instance2.colors);//red,blue,green
//alert(instance2.getColors());//red,blue,green

  

//2.组合继承 最常用的继承模式
//也叫伪经典继承,组合了原型链和借用构造函数的技术的一种继承方式
//通过结合构造函数定义属性的方式,还可以为超类型传递参数;采用原型链就不用将方法写在构造函数里面
function SuperType(name) {
this.colors = ["red","blue","green"];
this.name = name;
//alert("我被调用");
} function SubType(name) {
//每个实例都会有一个colors属性的副本
SuperType.call(this,name);//第二次调用SuperType()
} SubType.prototype = new SuperType();//第一次调用SuperType()
SuperType.prototype.getColors = function() {
return this.colors;
};
var instance1 = new SubType("youyi");
//alert(instance1.name);//youyi
var instance2 = new SubType("xiaobai");
//alert(instance2.name);//xiaobai

  

//3.原型式继承
//没有严格意义上的构造函数,借用原型基于已有的对象创建新对象
function object(o) {
function F(){}
F.prototype = o;
return new F();
} //var person = {
// name: "youyi",
// friends: ["小花","小白","小明"]
//};
//
//var anotherPerson1 = object(person);
//anotherPerson1.name = "王宝强";
//anotherPerson1.friends.push("小马");
//
//var anotherPerson2 = object(person);
//anotherPerson2.name = "陈思成";
//anotherPerson2.friends.push("宝宝"); //console.log(person.friends);//["小花", "小白", "小明", "小马", "宝宝"]
//console.log(person.name);//youyi //与object()方法行为相同的object.create()
var person = {
name: "youyi",
friends: ["小花","小白","小明"]
}; var anotherPerson1 = Object.create(person);
anotherPerson1.name = "王宝强";
anotherPerson1.friends.push("小马"); var anotherPerson2 = Object.create(person);
anotherPerson2.name = "陈思成";
anotherPerson2.friends.push("宝宝"); //console.log(person.friends);//["小花", "小白", "小明", "小马", "宝宝"]
console.log(anotherPerson1.name);//王宝强
console.log(person.name);//youyi //object.create()方法的第二个参数是通过自己的描述符定义的,该属性会覆盖原型对象上的同名属性
var person = {
name: "youyi",
friends: ["小花","小白","小明"]
}; var anotherPerson1 = Object.create(person,{
name: {
value: "王宝强"
}
}); anotherPerson1.friends.push("小马"); var anotherPerson2 = Object.create(person);
anotherPerson2.name = "陈思成";
anotherPerson2.friends.push("宝宝");
console.log(person.friends);//["小花", "小白", "小明", "小马", "宝宝"]
console.log(anotherPerson1.name);//王宝强
console.log(person.name);//youyi

  

//4.寄生式继承
//缺点是,因为函数不能复用而降低效率,这点与构造函数模式类似
function createAnother(original) {
var clone = object(original);
//var clone = {};
clone.sayHi = function() {
console.log("hi");
};
return clone;
} //没有严格意义上的构造函数,借用原型基于已有的对象创建新对象
function object(o) {
function F(){}
F.prototype = o;
return new F();
} var person = {
name: "youyi",
friends: ["小花","小白","小明"]
}; var anotherPerson3 = createAnother(person);
anotherPerson3.sayHi();//hi

  

//5.寄生组合式继承
//效率更高的一种继承模式,通过构造函数来继承属性,通过原型链的混成形式来继承方法
//组合继承中会两次调用SuperType()
//寄生组合式继承相当于是对组合继承模式的一种优化 //原理还是要让子类型的原型等于一个超类型的实例
function inheritPrototype(subType,superType) {
var prototype = object(superType.prototype);
prototype.constructor = subType;
subType.prototype = prototype;
} //没有严格意义上的构造函数,借用原型基于已有的对象创建新对象
function object(o) {
function F(){}
F.prototype = o;
return new F();
} function SuperType(name) {
this.colors = ["red","blue","green"];
this.name = name;
alert("我被调用2");
} function SubType(name) {
//每个实例都会有一个colors属性的副本
SuperType.call(this,name);//调用SuperType() 只调用一次
} //SubType.prototype = new SuperType();//第一次调用SuperType()
//优化上面的方法
inheritPrototype(SubType,SuperType); SuperType.prototype.getColors = function() {
return this.colors;
};
var instance1 = new SubType("youyi");
alert(instance1.name);//youyi
//var instance2 = new SubType("xiaobai");
//alert(instance2.name);

  

es6中通过extends实现继承

es5和es6实现继承的区别:es5主要是先创建子类的实例对象的this,然后再将父类方法添加到this上;而es6相反,所以在子类构造函数中必须先调用super,将父类实例对象的属性和方法添加到this上,然后再用子类的构造函数修改this。

JavaScript中的继承模式总结(九)的更多相关文章

  1. 浅谈 JavaScript 中的继承模式

    最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...

  2. JavaScript中的继承模式总结

    一.总结: //js中的几种继承 //原型链的问题,包含引用类型的原型属性会被实例共享,子类型无法给超类型传递参数 function SuperType() { this.colors = [&quo ...

  3. 浅谈JavaScript中的继承

    引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...

  4. JavaScript中的继承(原型链)

    一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.pro ...

  5. 关于JavaScript中实现继承,及prototype属性

    感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...

  6. JavaScript学习13 JavaScript中的继承

    JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...

  7. 理解javascript中的策略模式

    理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效 ...

  8. 彻底搞懂JavaScript中的继承

    你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...

  9. ES6中的类继承和ES5中的继承模式详解

    1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...

随机推荐

  1. Quartz表结构说明

    一.表信息解析: 1.1. qrtz_blob_triggers : 以Blob 类型存储的触发器. 1.2. qrtz_calendars:存放日历信息, quartz可配置一个日历来指定一个时间范 ...

  2. Python 数值计算库之-[Pandas](六)

  3. DevExpress WPF入门指南:Smart Tag扩展功能

    Smart Tag提供了一些扩展功能用于简化指定某些属性的程序,比如下面这几项: Application Theme Data Context Image Gallery Convert to DXW ...

  4. DevExpress v17.2新版亮点—WPF篇(四)

    DevExpress年终击穿底价,单套授权低至67折!仅剩最后6天!查看详情>>> 用户界面套包DevExpress v17.2终于正式发布,本站将以连载的形式为大家介绍各版本新增内 ...

  5. Python学习(006)-深浅拷贝及集合

     深浅拷贝 import copy husband=['xiaoxin',123,[200000,100000]] wife=husband.copy() #浅拷贝 wife[0]='xiaohong ...

  6. macOS 使用brew安装mysql,客户端连接不上

    macos 使用brew安装mysql8.0后,使用mysql官方的workbench连接不上,出现√ mysql8.0 Authentication plugin 'caching_sha2_pas ...

  7. Guided Image Filtering

    在图像滤波中,人们最希望的就是可以将图像中的噪声过滤掉的同时,能够让边缘尽可能的保持.噪声属于高频信号,而边缘其实也是一种高频信号,所以一般的滤波器,比如高斯模糊,均值模糊,都是一种低通滤波器,能够将 ...

  8. python3:定时执行自动化测试脚本

    转载请注明出处:https://www.cnblogs.com/shapeL/p/9172990.html 1.windows任务计划定时执行脚本 (1)创建 .bat 文件,执行脚本的命令(inte ...

  9. Dockerfile构建mysql数据库

    dockerfile文件: FROM centos:centos6  MAINTAINER admin "admin@topsec.com.cn"    RUN yum insta ...

  10. 温度传感器的AD值,电压和电阻的计算方法

    V是输入的电压,VCC是标准电压,R为固定电阻,NTC为热敏电阻.计算公式是V=(NTC/(NTC+R))*VCC电压或电阻转化AD的计算方式为AD=(V/VCC)*2^n=(NTC/(NTC+R)) ...