javascript 继承方法总结
2012-06-01 22:44
211 查看
实际真正算起来js中继承的方法也就三种,下面一一说明
第一种:原型链继承
第一种:原型链继承
先说原型继承的语句,newFunction.prototype=new oldFunction()
很简单就是将基函数的一个实例赋给新函数的原型,这种继承方法可以说是直接,简单,有效,基函数中的所有属性方法都可以被继承,推荐使用.
不过这种方法也有不足,比如说当基函数中的属性有一个是动态属性的时候,oldFunction.arr=[“lirongfei”,”yangdanping”];当继承这个基函数后,所有的新函数都会包含一样的arr属性,特别是当你arr.push()新值的时候,所有的新函数的arr属性都是一样的.因为你改变的是所有新函数所共有的原型对象
总结一点:原型链继承方法,使用,但由于原型实例共享的特点,所以当基函数中包含有动态属性(比如数组)时,而且你要根据不同实时改变时,就不能用这种方法继承了
第二种:构造函数继承很简单就是将基函数的一个实例赋给新函数的原型,这种继承方法可以说是直接,简单,有效,基函数中的所有属性方法都可以被继承,推荐使用.
不过这种方法也有不足,比如说当基函数中的属性有一个是动态属性的时候,oldFunction.arr=[“lirongfei”,”yangdanping”];当继承这个基函数后,所有的新函数都会包含一样的arr属性,特别是当你arr.push()新值的时候,所有的新函数的arr属性都是一样的.因为你改变的是所有新函数所共有的原型对象
总结一点:原型链继承方法,使用,但由于原型实例共享的特点,所以当基函数中包含有动态属性(比如数组)时,而且你要根据不同实时改变时,就不能用这种方法继承了
先说构造函数继承的语句:
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”,…]);
}
第二种方法对那些只包含属性的基函数,很实用,首选,但是如果基函数中包含方法属性,就不推荐使用,原因就是构造函数内部函数会重复调用的问题,谈不上对象复用
第三种:实例继承function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”,…]);
}
第二种方法对那些只包含属性的基函数,很实用,首选,但是如果基函数中包含方法属性,就不推荐使用,原因就是构造函数内部函数会重复调用的问题,谈不上对象复用
这种方式要区别原型链继承,先说继承方法
第一步:公用继承函数:
function object(o){
function f(){};
f.prototype=o;
return new f();
}
第二步:当你已经有一个实例时,注意是实例,而不是对象,就可以var newFunction=new object(nowInstance);这样就复制出当前实例的一个副本,然后你就可以想这个副本中添加新的属性和方法,而且不会影响当前实例
这种方法的使用情景就是,当你现在有一个实例时,用这种方法先(通过原型赋值)复制出这样一个实例,然后向这个副本中添加新的属性和方法
缺点就是实际内部也是通过原型链实现的,当然缺点也是属性共享,而不能独享,优势就是你可以直接那实例来继承,而不用new一个新实例,同时也浪费了当前实例.
和原型链继承的区别就是,这个事继承实例,而原型链是继承对象
第三种:通用最佳继承方法继承第一步:公用继承函数:
function object(o){
function f(){};
f.prototype=o;
return new f();
}
第二步:当你已经有一个实例时,注意是实例,而不是对象,就可以var newFunction=new object(nowInstance);这样就复制出当前实例的一个副本,然后你就可以想这个副本中添加新的属性和方法,而且不会影响当前实例
这种方法的使用情景就是,当你现在有一个实例时,用这种方法先(通过原型赋值)复制出这样一个实例,然后向这个副本中添加新的属性和方法
缺点就是实际内部也是通过原型链实现的,当然缺点也是属性共享,而不能独享,优势就是你可以直接那实例来继承,而不用new一个新实例,同时也浪费了当前实例.
和原型链继承的区别就是,这个事继承实例,而原型链是继承对象
和创建对象一样,继承的最好方法就是联合构造函数和原型链继承两种方法,达到高效,功能强大的继承
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”]);
}
function inherit(newFunction,oldFunction){
var prototype=oldFunction.prototype;
prototype.constructor=newFunction;
newFunction.prototype=prototype;
}
inherit(newFunction,oldFuncton);
这种方法可以说堪称完美,思想就是通过构造函数继承属性特别是动态属性,然后通过原型来继承原型,很完美.
实际很多初学者会觉得下面这种方法也行
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”]);
}
newFunction.prototype=new oldFunction();
实际这样继承的所有功能也都能实现,包括动态属性,对象复用,都没问题,但是有一点遗憾:就是你每一次调用此对象,都会调用基函数的两次构造函数,这一点不好.读者可以想想是那两个地方调用了两次
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”]);
}
function inherit(newFunction,oldFunction){
var prototype=oldFunction.prototype;
prototype.constructor=newFunction;
newFunction.prototype=prototype;
}
inherit(newFunction,oldFuncton);
这种方法可以说堪称完美,思想就是通过构造函数继承属性特别是动态属性,然后通过原型来继承原型,很完美.
实际很多初学者会觉得下面这种方法也行
function newFunction(){
oldFunction.call(this,[“canshu1”,”canshu2”]);
}
newFunction.prototype=new oldFunction();
实际这样继承的所有功能也都能实现,包括动态属性,对象复用,都没问题,但是有一点遗憾:就是你每一次调用此对象,都会调用基函数的两次构造函数,这一点不好.读者可以想想是那两个地方调用了两次
总结继承无外乎三种方式,一种方法,但读者一定要注意的地方就是,继承基本是靠原型链实现的,所以当你向新的函数中添加新的属性和方法时(通过原型方法添加),一定不能用对象字面量的方式,应为这样就会覆盖基函数原型对象,另外一点就是,通过原型添加新属性的代码一定要放在通过原型继承的代码之后,否则,新添加的方法同样也会被覆盖.
相关文章推荐
- JavaScript 继承的方法总结
- JavaScript实现继承的4种方法总结
- JavaScript继承方法总结
- JavaScript实现继承的4种方法总结
- JavaScript获取HTML DOM节点元素的方法的总结
- IE和Firefox 在JavaScript方面的不兼容及统一方法总结
- JavaScript 函数节流详解及方法总结
- JavaScript里的循环方法总结
- javascript实现回车键提交表单方法总结
- javascript的call方法总结
- javascript数组的常用方法总结
- JavaScript中B继承A的方法
- 【转】Java方法继承、方法重载、方法覆盖小总结
- Javascript基础知识盲点总结——继承
- javaScript面向对象继承方法经典实现
- 把json格式的字符串转换成javascript对象或数组的方法总结
- JavaScript获取DOM元素的方法总结
- 复习系列--javascript数组的常用方法总结
- JavaScript原型链与继承内容总结
- javascript数组去重的三种常用方法总结