JavaScript中的继承模式总结
一、总结:
- //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中的继承模式总结的更多相关文章
- 浅谈 JavaScript 中的继承模式
最近在读一本设计模式的书,书中的开头部分就讲了一下 JavaScript 中的继承,阅读之后写下了这篇博客作为笔记.毕竟好记性不如烂笔头. JavaScript 是一门面向对象的语言,但是 ES6 之 ...
- JavaScript中的继承模式总结(九)
一.总结: //js中的几种继承 //原型链的问题,包含引用类型的原型属性会被实例共享,子类型无法给超类型传递参数 function SuperType() { this.colors = [&quo ...
- 浅谈JavaScript中的继承
引言 在JavaScript中,实现继承的主要方式是通过原型链技术.这一篇文章我们就通过介绍JavaScript中实现继承的几种方式来慢慢领会JavaScript中继承实现的点点滴滴. 原型链介绍 原 ...
- JavaScript中的继承(原型链)
一.原型链 ECMAScript中将原型链作为实现继承的主要方法,基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 实例1: function SupType() { this.pro ...
- 关于JavaScript中实现继承,及prototype属性
感谢Mozilla 让我弄懂继承. JavaScript有八种基本类型,函数属于object.所以所有函数都继承自object.//扩展:对象,基本上 JavaScript 里的任何东西都是对象,而且 ...
- JavaScript学习13 JavaScript中的继承
JavaScript学习13 JavaScript中的继承 继承第一种方式:对象冒充 <script type="text/javascript"> //继承第一种方式 ...
- 理解javascript中的策略模式
理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效 ...
- 彻底搞懂JavaScript中的继承
你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- "继承"就和"原型链"这一概念息息相关.甚至可以说,所谓的"原型链&q ...
- ES6中的类继承和ES5中的继承模式详解
1.ES5中的继承模式 我们先看ES5中的继承. 既然要实现继承,首先我们得要有一个父类. Animal.prototype.eat = function(food) { console.log(th ...
随机推荐
- win7 64 下安装ubuntu14.04
win7下安装ubuntu方法: * 使用win7下的自带的分区工具给ubuntu留出磁盘空间:计算机 -> 右键菜单选择管理 -> 选择磁盘管理->选中最后的那个磁盘->右键 ...
- linux.打包与压缩
//打包tar -zcvf etc.tar.gz /etc//解包tar -zxvf hdmzy.tar.gz
- editplus 替换换行 excel 表格 拼装sql语句技巧
这样的数据 放到sql中的in 语句中的时候格式需要换行 加上‘,’这样的内容. 操作内容: 用editplus 进行操作.Ctrl+H 查找的地方输入 \n ,替换的地方填写 ',' ...
- 38. Count and Say
The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111221 ...
- 关于Toad连接DB2的sqlstate=08001错误
新装的centos6.3+db29.7,数据库导入完了的之后用Toad连接访问之的时候出错了. DB2 Database Error: ERROR [08001] [IBM] SQL30081N A ...
- python--切片--6
原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ 一.对list进行切片 取一个list的部分元素是非常常见的操作.比如,一个list如下: &g ...
- 工作中遇到的问题--Hibernate一对多保存简化Service层代码
在创建一方的entity是添加一个增加多方的方法: package com.sim.mfg.data.domain; import java.io.Serializable;import java.u ...
- 《Java程序设计》第3周学习总结
学号20145220<Java程序设计>第3周学习总结 教材学习内容总结 使用jave撰写程序几乎都在使用对象(Object),要产生对象必须先定义类(Class),类是对象的设计图,对象 ...
- ed编辑器使用
evilxr@IdeaPad:/tmp$ ed aa.c 0 a enter another words hello nice www.evilxr.com . w aa.c 46 q a 表示添加内 ...
- java编程之:生成rsa密钥
通过openssl工具生成RSA的公钥和私钥(opnssl工具可在互联网中下载到,也可以点此下载无线接口包,里面包含此工具) 打开openssl文件夹下的bin文件夹,执行openssl.exe文件: ...