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 ...
随机推荐
- careercup-C和C++ 13.8
13.8 编写一个智能指针类.智能指针是一种数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制.它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的 ...
- C++中如何修改const变量
一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...
- java_泛型,设置类型通配符的上限
package ming; import java.util.ArrayList; import java.util.Collection; import java.util.List; class ...
- Android之获取联系人
Android入门中,记录学习中的遇到的问题和一些个人总结. 联系人数据库路径为:/data/data/com.android.providers.contacts/database/contacts ...
- mysql 按月按周统计
http://hi.baidu.com/liangjian1024/blog/item/6861541b1416094842a9ad7c.html 表finance有俩个字段如下 date date ...
- CentOS7安装Tomcat8.X
安装说明 安装环境:CentOS7安装方式:源码安装软件:apache-tomcat-8.0.30.tar.gz下载地址:http://tomcat.apache.org/download-80.cg ...
- Javascript学习总结三(Array对象的用法)
javascript Array对象的常用API 1:concat concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本.举例:var a1 = [ ...
- 微信公众平台接口API
<?php /** * Author: helen * CreateTime: 2015/12/9 20:14 * description: 微信公众平台接口API */ class Wecha ...
- Yii2查询语句使用不等于号
Yii2 Active Record查询条件使用不等于号,需要使用到 operator format: [operator, operand1, operand2, ...] 运算符格式: [运算符, ...
- android之硬件访问服务框架
一.硬件接口描述文件aidl 新增\frameworks\base\core\java\android\os\ILedService.aidl 二.mk编译脚本 修改vi frameworks/bas ...