/**
* 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 继承的几种模式的更多相关文章

  1. javascript继承的三种模式

    javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...

  2. JavaScript继承的几种模式

    原型链 让一个类的原型对象指向另一个类的实例

  3. JS学习笔记——JavaScript继承的6种方法(原型链、借用构造函数、组合、原型式、寄生式、寄生组合式)

    JavaScript继承的6种方法 1,原型链继承 2,借用构造函数继承 3,组合继承(原型+借用构造) 4,原型式继承 5,寄生式继承 6,寄生组合式继承 1.原型链继承. <script t ...

  4. JavaScript继承的几种实现

    0 什么是继承 继承就是获得存在对象已有的属性和方法的一种方式. [2019.4.26 更新]今日又重新学习了一下JS的继承,在这里整理一下以前的笔记并补充一些新的感悟. 1 JS中继承的几种实现方法 ...

  5. javascript 创建对象的7种模式

    使用字面量方式创建一个 student 对象: var student = function (){ name : "redjoy", age : 21, sex: women, ...

  6. Javascript函数调用的四种模式

    一 前言 Javascript一共有四种调用模式:方法调用模式.函数调用模式.构造器调用模式以及apply调用模式.调用模式不同,对应的隐藏参数this值也会不同. 二 方法调用模式 函数作为对象的属 ...

  7. javascript创建对象的几种模式

    在js中有几种模式可以创建对象,通过对象操作所包含的属性与方法. 一般来说,构造函数名称的第一个字母为大写字母,非构造函数名称的第一个字母为小写字母,当然,构造函数与一般函数唯一的区别只是调用的方式不 ...

  8. js(javascript) 继承的5种实现方式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt240 js继承有5种实现方式:1.继承第一种方式:对象冒充  functio ...

  9. 总结javascript继承的两种方式的N中写法

    最近翻看博客园,总结了一下javascript的继承方式:prototype和copy继承方式. 一.prototype方式 当一个函数被创建时,Function构造函数产生的函数会隐式的被赋予一个p ...

随机推荐

  1. WaterWave

    WaterWave.rar

  2. windows平台下php版本问题–VC6/VC9和TS/NTS

    php下载页面中提供了4个下载版本,是vc6/vc9 与 TS/NTS的组合 VC6:legacy Visual Studio 6 compiler,就是使用这个编译器编译的.        VC9: ...

  3. 面试题总结之JAVA

    JAVA 1. what is thread safe? 线程安全就是说多线程访问同一代码,不会产生不确定的结果.编写线程安全的代码是低依靠线程同步.线程安全: 在多线程中使用时,不用自已做同步处理线 ...

  4. 【ZT】修复iCloud中查找我的iPhone、查找我的iPad无法显示地图的方法

    http://blog.sina.com.cn/s/blog_4ff28d30010118cm.html 进入C:\Windows\System32\drivers\etc在hosts文件里加入如下地 ...

  5. PHP中的可变参数函数和可选参数函数

    1)可选参数函数.例如: <?phpfunction add($var1,$var2,$var3=0,$var4=0){ return$var1+$var2+$var3+$var4;}echo ...

  6. Redis的安装、配置 --转载

    原文地址:http://blog.sina.com.cn/s/blog_505bf9af0101ehhp.html redis的安装.配置 安装步骤如下:下载redis安装包:$ cd /opt/ap ...

  7. View绘制详解(二),从setContentView谈起

    掐指一算,本来今天该介绍View的测量了,可是要说View的测量,那就要从setContentView谈起了,setContentView本身涉及到的东西也是挺多的,所以今天我们就先来看看这个setC ...

  8. servlet案例

    1.重定向 方式1:在servlet中写:response.setStatus(302);      response.setHeader("Location","路径& ...

  9. ios存储 plist 偏好设置 自定义对象存储

    1,plist Plist注意:不能存储自定义对象 Plist:数组和字典,  如何判断一个对象能不能使用Plist,就看下有没有writeToFile 获取应用的文件夹(应用沙盒) NSString ...

  10. scala学习笔记:理解stream和view

    先来个正常的: scala> (0 to 5).map((x:Int)=>{println(x);x*2}).foreach(println) 0 1 2 3 4 5 0 2 4 6 8 ...