JS实现继承的几种方式
2018-06-24 00:07:44来源:未知 阅读 ()
本文我们来简单的说下js的继承,本文的基础是在JS原型基础至上的,所以必须对JS的原型有一定的了解。
原型继承
原型继承:道格拉斯·克罗克福德在 2006年写了一篇文章,题为 Prototypal Inheritance in JavaScript (JavaScript
中的原型式继承)。在这篇文章中,他介绍了一种实现继承的方法,这种方法并没有使用严格意义上的
构造函数。他的想法是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。
这段文字引用的是javascript高级程序设计第三版6.3.4
简单解释:原型继承就是子类根据原型链去找父类的一些方法和属性。
A.prototype=new B()
说白了就是把A的原型指向B的实例这样,B中的私有/公有方法和属性就变成了A的公有方法和属性了。
举个栗子:
function A(){
}
function B(){
this.name='bob'
}
A.prototype = new B();
var a = new A();
console.log(a.name);//bob
在很多书中是这样的:
function object(o){
function F(){}
F.prototype = o;
return new F();
}
var person = {
name: "Nicholas",
friends: ["Shelby", "Court", "Van"]
};
var anotherPerson = object(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");
var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");
alert(person.friends); //"Shelby,Court,Van,Rob,Barbie"
很多书中是这样的,或者类似这样的,其实这是最早大神道格拉斯·克罗克福德在06年提出的,到后来ECMAScript 5 通过新增 Object.create() 方法规范化了原型式继承。
Object.create()是啥意思呢?
创建一个拥有指定原型和若干指定属性的对象!有两个参数
一个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。
用法和上面大神道格拉斯·克罗克福德给出的方式是一样的大家可以参考下面的地址
Object.create()
构造继承
其实就是用call这个方法来实现的,也很简单
function A(){
this.name='fakin';
}
function B(){
A.call(this)
}
var c=new B;
console.log(c.name)//fakin
原理:利用call方法把A中的this变成B中的this,并且执行A,而var c=new B;使得B中的this变成了所以c中有了A中的name属性。
特点:是把父类的属性和方法复制一份一模一样的!和原型继承差很多哦,原型继承只是把子类和父类做一个链式关系,以后要用的时候还得去原型上面上找。
组合继承
和构造继承差不多也是用了call,但是组合继承是call+原型
function A(){
this.name='fakin';
}
function B(){
A.call(this)
}
B.prototype=new A;
B.prototype.constructor=B;
var n= new B;
组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为 JavaScript 中最常用的继承模式
冒充对象继承
function A(){
this.x=100;
}
function B(){
var o=new A;
for(var key in o){
this[key]=temp[key]
}
o=null;
}
var n= new B;
其实就是拷贝一份一模一样的。
寄生组合式继承
function A(){
this.x=100;
}
A.prototype.getX=function(){
consoloe.log(this.x)
}
function B(){
A.call(this)//n.x=100
}
B.prototype=Object.create(A.prototype)
B.prototype.constructor=B;
var n= new B;
关于JS继承就说道这里,肯定还有没有说道的地方,欢迎大家补充,有说错的地方希望大家指正!
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:【前端】前端笔试题 [1]
- js防止表单重复提交实现代码 2020-03-29
- 基于JQuery的多标签实现代码 2020-03-29
- js实现翻页后保持checkbox选中状态的实现方法 2020-03-25
- NiftyCube实现圆角边框的方法 2020-03-20
- JS实现标签页切换效果 2020-03-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash