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 ...
随机推荐
- Codeforces Round #324 (Div. 2) A. Olesya and Rodion 水题
A. Olesya and Rodion Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/584/p ...
- IOS debug网络PonyDebugger 实践篇
引言: PonyDebugger是一个很给力的iOS调试工具,它的监视器安装在Chrome浏览器下做为插件使用,通过监视器和PonyDebugger的iOS SDK相辅相成,可以很好的监视App的运 ...
- [HTML5] Input accepts only 6 number characters
Use 'pattern' tag in html5: <input type="text" pattern="[0-9]{6}" maxlength=& ...
- iOS开发——面试笔试精华(三)
面试笔试精华(三) 1. When to use NSMutableArray and when to use NSArray? 什么时候使用NSMutableArray,什么时候使用N ...
- HIDKomponente使用读写Hid设备一瞥
HIDKomponente 是delphi中使用的第三方Hid控件库,可以检测.控制连接到电脑的Hid设备.一般情况下多为usb设备.HIDKomponente的使用实际上很简单,只是因为第一次使用, ...
- ajax检查用户名
Ajax实现的效果 究竟Ajax能实现什么功能呢?今天下午学习了一下Ajax,现在跟大家分享一下我的学习心得.Ajax是什么?工作机制又是什么?可能不大准确,只是我个人看了视频学习后的一点点看法. A ...
- C#数据操作LINQ
Linq是language integrated query的缩写,即"语言集成查询"之意. Linq主要包含四个组件,Linq to object.Linq to XML.Lin ...
- Objective-C中系统宏的用法总结
先说一下本文中会提到的内容:##,__VA_ARGS__, __FILE__, __LINE__ , __FUNCTION__等 宏变量: 先举一个例子,会用到上面这些宏: #define mypri ...
- WebSocket实时异步通信
WebSocket实时异步通信 [一]WebSocket简介 WebSocket是HTML5推出一个协议规范,用来B/S模式中服务器端和客户端之间进行实时异步通信. 众所周知,传统的HTTP协议中,服 ...
- java1.5新特性
一:增强for循环 增强for的格式:for(数据类型 变量名:集合或者 数组){ } 传统的for循环可以对数组进行遍历: for(int x=0;x { Syste ...