javascript实现继承的几种方式
javascript实现继承的几种方式
jquery的口号是“write less,do more”,时间宝贵、青春无价。很多人会尽可能少的编写代码,并且尽可能多的复用别人写过的优质代码,而继承显然是实现代码高效复用的一种很好的方式。javascript不像java、c++此类编程语言中存在extend关键字,javascript继承都是通过自己写的方法实现,下面为大家介绍博主所知道的几种继承方式
使用类式继承的预期结果
function Parent(name) {
this.name = name || 'bob';
}
Parent.prototype.say = function() {
return this.name
}
function Child() {}
//实现继承
inherit(Child, Parent);
1:原型链继承
function inherit(Child, Parent) {
Child.prototype = new Parent();
}
该方法实现比较简单,但缺点也显而易见--不支持将参数传递到子构造函数中,而子构造函数然后又将参数传到父构造函数中,且创建多个Parent对象造成性能下降,考虑以下例子:
var child = new Chlid('jack');
child.say(); //输出 ‘bob’
2:借用构造函数
function Child(name) {
Parent.call(this, 'jack');
}
new Child().name //jack
new Child().say //undefined
该方法能获得继承成员的副本,但是却无法继承父类的原型
3:组合方式
function Child() {
Parent.call(this, 'jack');
}
Child.prototype = new Parent();
使用该方法时应当将复用的成员放到Parent的原型中,这种方式的缺点是,父构造函数被调用两次,造成效率低下。
4:临时构造函数
var inherit = (function(){
var F = function() {};
return function(C, P) {
F.prototype = P.prototype;
C.prototype = new F();
C.constructor = C;
};
}())
这种方式被称为圣杯模式,是一种比较好的解决方案,而且该模式可以避免在每次继承时都创建临时代理函数(F)
5:拷贝复制--深拷贝
function extentDeep(parent, child) {
var i,
toStr = Object.prototype.toString,
aStr = '[object Array]';
child = child || {};
for(i in parent) {
if(parent.hasOwnProperty(i)) {
if(typeof parent[i] === 'object') {
child[i] = (toStr.call(parent[i]) === aStr) ? [] : {};
extentDeep(parent[i], child[i]);
}else{
child[i] = parent[i];
}
}
}
return child;
}
总结
继承的方式有多种,实际开发中采用哪种模式,取决于具体的需求。 今日鸡血----keep on fighting!!!