JavaScript 继承的几种模式
/**
* Created by 2016 on 2016/6/5.
*/
//1、原型链继承
//把子类的原型,定义为超类的实例 通过原型来访问超类的方法和属性
function Person(){//超类
this.age = 40;
this.run = function(){
console.log("Person is running");
}
}
function Student(){}//子类
Student.prototype = new Person();//实现继承 //注意:如果要重写或者添加子类的方法,需要在继承之后。
//缺点:1、如果属性中存在引用类型的值,由于属性是共享的,修改属性会同步修改。
// 2、无法给超类的构造函数传递参数
// 3、无法实现多继承 //2、借用构造函数
//在子类的构造函数内部调用超类的构造函数。利用apply(obj,[])和call(obj,arg1,arg2)函数
function Person(){//超类
this.age = 40;
this.run = function(){
console.log("Person is running");
}
} function Student(){
Person.call(this);//调用超类的构造函数,这里可以传递参数
} var student = new Student();
student.run();//"Person is running"
//缺点:1、借用构造函数,导致所有的方法都在构造函数中定义,方法无法复用
// 2、超类原型中的方法和属性,对于子类来说是无法访问的,导致所有类型都必须使用构造函数模式。 //3、组合继承
//伪经典继承 将原型链继承和借用构造函数的继承组合起来使用。借用构造函数方式实现属性的继承,原型链的方式实现方法继承
//实现了方法的复用和属性的独立。组合继承是常用的继承方式
function Person(){
this.age = 40;
}
Person.prototype = {
constructor:Person,
run:function(){
console.log("Person is running");
}
};
function Student(){
Person.call(this);//继承属性
}
Student.prototype = new Person();//继承方法 //缺点:由于属性和方法分开继承,导致一定会调用两次的超类构造函数。可以使用寄生组合继承的方式优化。 //4、原型式继承
//基于原型继承,和原型链的继承相似,这里返回一个子类的实例
function object(o){
function F(){}//创建一个临时构造函数
F.prototype = o;
return new F();
}
//ECMAScript5对原型式继承进行了规范,可以使用Object.create()方法来继承。这个函数接收两个参数,用作子类原型的超类对象,和
// (可选的)为新对象指定的属性对象,看代码 var Person = {//超类
age:40,
run:function(){
console.log("Person is running");
}
};
var student = Object.create(Person,{age:30});
student.run();//Person is running
student.age;// //5、寄生继承
//使用一个函数来实现继承,函数参数为超类对象,通过复制超类对象——增强对象——返回结果对象的方式,来实现继承 function createObject(obj){
var newObj = object(obj);//创建新对象
newObj.run = function(){//增强对象
console.log("Person is running");
};
return newObj;//返回结果对象
}
var Person ={
age : 40,
walk : function(){
console.log("Person is walking");
}
};
var student = createObject(Person);
student.walk();
student.run(); //注意:这里传入的obj必须是实例,不能是构造函数。
//缺点:和借用构造函数方式一样,方法无法复用。 //6、寄生组合式继承
//避免组合式继承调用两次超类的构造函数,提高效率
function inheritPrototype(subType,superType){//继承原型函数,参数为子类,超类
var prototype = Object.create(subType.prototype);//生成超类的原型副本
prototype.constructor = subType;//将原型副本的constructor指向子类
subType.prototype = prototype;//指定子类的新原型,实现继承属性 }
function Person(){
thi.age = 40;
}
Person.prototype = {
run:function(){
console.log("Person is walking");
}
};
function Student(){
Person.call(this);
}
inheritPrototype(Student,Person);//继承超类(原型继承)
var student = new Student();
student.run();//"Person is walking"
student.age;// //继承的最有效方式
JavaScript 继承的几种模式的更多相关文章
- javascript继承的三种模式
javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...
- JavaScript继承的几种模式
原型链 让一个类的原型对象指向另一个类的实例
- JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)
JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...
- JavaScript继承的几种实现
0 什么是继承 继承就是获得存在对象已有的属性和方法的一种方式. [2019.4.26 更新]今日又重新学习了一下JS的继承,在这里整理一下以前的笔记并补充一些新的感悟. 1 JS中继承的几种实现方法 ...
- javascript 创建对象的7种模式
使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...
- Javascript函数调用的四种模式
一 前言 Javascript一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式以及apply调用模式.调用模式不同,对应的隐藏参数this值也会不同. 二 方法调用模式 函数作为对象的属 ...
- javascript创建对象的几种模式
在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不 ...
- js(javascript) 继承的5种实现方式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt240 js继承有5种实现方式:1.继承第一种方式:对象冒充 functio ...
- 总结javascript继承的两种方式的N中写法
最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式. 一.prototype方式 当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个p ...
随机推荐
- 从零开始学android开发-sqlitepro安装
- BZOJ 1927: [Sdoi2010]星际竞速 费用流
1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 设计模式之十三:适配器模式(Adapter)
适配器模式: 将一个类的接口转换成另外一个期望的类的接口.适配器同意接口互不兼容的类一起工作. Convert the interface of a class into another interf ...
- string中find函数的使用
9.47 编写程序,首先查找string"ab2c3d7R4E6"中的每个数字字符,然后查找其中每个字母字符.编写两个版本的程序,第一个要使用find_first_of,第二个要使 ...
- [Effective C++ --013]以对象管理资源
这一节基本讲述的是将资源放进管理对象,防止忘记释放资源. 1.一般New和Delete使用场景 void fun() { SimpleClass* pSimpleClass1 = new Simple ...
- Getting started: A skeleton application
Getting started: A skeleton application In order to build our application, we will start with theZen ...
- SQL SERVER 2005 同步复制
what SQL SERVER2005复制是在不同数据库间保持数据结构和数据内容同步更新的一种方案. 由三部分构成: 发布服务器:包含了需要被发布的数据库,也就是需要向其它数据源分发内容的源数据库. ...
- windows下mysql初始密码设置
转载自:http://blog.csdn.net/ofreelander/article/details/50802780 1.my-default.ini 改名my.ini 在解压的目录下面复制my ...
- html select用法总结
本文将介绍select 原生的常用方法,这些都是经过测试,兼容ie6到ie10,及chrome,火狐等,也就是说大部分浏览器都兼容.如果大家发现有不兼容的情况,可以跟我留言. 我们对基本的用法了如指掌 ...
- Tomcat启动报错 Failed to start component [StandardServer[8005]]解决
SEVERE: The required Server component failed to start so Tomcat is unable to start. org.apache.catal ...