/**
* 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. android学习日记24--Android 菜单开发

    菜单是任何应用程序必不可少的一项.按下Menu键或者长按某个View就会弹出相应菜单,当然前提是应用程序有实现菜单功能. Android平台下的菜单有:Options Menu(选项菜单).Subme ...

  2. 在centos上使用yum安装redis及php扩展php-redis

    .wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm rpm -ivh epel-rele ...

  3. Linux lsof命令使用小结

        lsof(list open files)是一个列出当前系统打开文件的工具.在Linux环境下,任何事物都是以文件的形式存在,通过文件不仅可以访问常规数据,还可以访问网络连接和硬件.所以,如传 ...

  4. careercup-中等难度 17.6

    17.6 给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的.注意:n越小越好,也就是说,找出符合条件的最短序列. 解法: 开始解题之前,让我们先确认一下 ...

  5. HttpWebRequest 模拟登录响应点击事件(分享自己用的HttpHelper类)

    平时也经常采集网站数据,也做模拟登录,但一般都是html控件POST到页面登录:还没有遇到用户服务器控件button按钮点击事件登录的,今天像往常一样POST传递参数,但怎么都能登录不了:最后发现还有 ...

  6. OpenCMS integration with Spring MVC--reference

    ref from:http://blogs.indrajitpingale.com/?p=8 http://blog.shinetech.com/2013/04/09/integrating-spri ...

  7. Volatile变量

    关于volatile变量的使用,由于使用得比较多,后面如果需要温习的话可以参考:http://www.infoq.com/cn/articles/java-memory-model-4

  8. Sublime Text3自动保存的功能(失去焦点自动保存)

    这是最新版本的Sublime Text3的设置方法 (三部曲); 第一步:preferences 下面的settings:(和老版本的不一样了吧,之前有什么default 和 users,这里只有se ...

  9. 【转】Myeclipse8.5 反编译插件 jad 安装

    [转]Myeclipse8.5 反编译插件 jad 安装 准备工作 下载jad.exe文件下载window版本:http://varaneckas.com/jad/ 下载jadeclipse插件:ht ...

  10. java和html的区别

    Java 不是一门程序语言,它是一个平台,也可以说是一门技术. Java 包括 1.Java 程式语言 一个类似 C++ 或 Smalltalk 的物件导向程式语言.学习 Java 程式语言类似学人类 ...