js的继承实现方法
来源:互联网 发布:电信 网络重构 编辑:程序博客网 时间:2024/04/30 17:45
一、原型链
利用prototype实现继承,prototype对象是个模板,要实例的对象都是以这个模板为基础,它的任何属性和方法都被传递给那个类的所有实例,原型链利用这种功能来实现继承机制。
如果利用原型方式实现继承,实例如下:
原型链
function ClassA(){
}
ClassA.prototype.color="red";
ClassA.prototype.sayColor=function(){
alert(this.color);
}
function ClassB(){
}
ClassB.prototype=newClassA();
通过原型链,ClassA的所有属性和方法传递给了ClassB,用prototype的确是方便很多。
注意的是调用ClassA的构造函数是,没有给它传递参数,这是在原型链中的标准做法。要确保构造函数没有任何参数。如果构造函数中有参数的话会怎样呢?那样便不能完全的继承,只能继承父类通过prototype初始的属性和方法,在构造函数中初始的属性和方法便不会继承。
与对象冒充相似,子类的所有属性和方法都必须出现在prototype属性被赋值之后,因为在它之前赋值的所有方法都会被删除。为什么呢?因为prototype属性被替换成了新的对象,原始对象的prototype属性以不复存在了,例如:
Code
function ClassB(){
}
ClassB.prototype=new ClassA();
ClassB.prototype.name="";
ClassB.prototype.sayName=function(){
alert(this.name);
}
二.构造继承法
构造继承法是使用了FUNCTION对象的call和apply方法。call的第一个参数用作this的对象,其余的参数是传给函数的参数。示例代码如下
function classA(sColor)
{
this.color=sColor;
this.sayColor=function()
{
alert(this.color);
}
}
function classB(sColor,sName)
{
classA.call(this,sColor);
this.name=sName;
this.sayName=function()
{
alert(this.name);
}
}
这样,classB内部先调用了classA的构造函数,将该构造函数的的啊用对象设置成classB的对象,从而实现了对classA的继承.而 apply的用法基本上和call相同,唯一的不同点是apply方法只有两个参数,第一个参数是用作this的对象,第二个参数是要传给构造函数的参数 数组。要注意,用prototype对象定义的属性和方法是不能用这种方法继承的。
三、混合方式
这种继承方式使用构造函数定义类,并未使用任何原型,对象冒充的主要问题是必须使用构造函数方式,这不是最好的选择。不过如果使用原型链,就无法使用带参的构造函数了。开发者该如何选择呢?答案很简单,两者都使用。创建类的最好方式是用构造函数方式定义属性,用原型方式定义方法。这种方式同样适用于继承机制,用对象冒充继承函数的属性,用原型链继承prototype对象的方法。
四、对象冒充实现多重继承
- 对象冒充
感觉这种方式利用了js中类和函数的模糊性,同是function关键字申明方法,既可以说他是函数,也可以说他是类,js太灵活了,下面的例子说明下:
function ClassA(sColor){
this.color=sColor;
this.sayColor=function(){
alert(this.color);
}
}
function ClassB(sColor){
this.newMethod=ClassA;//把ClassA方法赋给newMethod.
this.newMethod();//调用newMethod.
delete this.newMethod;}
ClassB执行ClassA方法便相当于继承了ClassA,在调用完毕后要删除newMethod,因为后续添加的属性和方法如果和超类同名,就会覆盖超类的相关属性和方法。
利用这种继承方式可以实现多重继承,如:
- 多重继承
function ClassD(sColor){
this.newMethod=ClassA;//把ClassA方法赋给newMethod,
this.newMethod();//调用newMethod
delete this.newMethod;
this.newMethod=ClassB;
this.newMethod();
delete this.newMethod;}
利用这种多重继承方法有个弊端,如果ClassA和ClassB具有相同的属性和方法,ClassB有较高的优先级。
- js的继承实现方法
- js实现继承的方法
- JS的Call方法实现的继承
- js继承的几种实现方法
- js实现继承的几种方法
- js实现继承的几种方法
- js实现继承的6种方法
- js实现继承的几种方法
- JS实现继承的几种方法
- js实现继承的几种方法
- js实现继承的6中方法
- JS的继承方法
- JS继承的实现
- js继承的实现
- js继承的实现
- js继承的实现
- js继承的实现
- js继承的实现
- NGUI使用教程(1) 安装NGUI插件
- 动态代理二之~jdk~proxy
- Linux 上的 DB2 内存和文件缓存性能调优
- 二分图最大匹配的匈牙利算法
- Linux内核开机保留大块内存的方法总结
- js的继承实现方法
- ORA-12514
- CGContextRef详解
- 字符数组与字符指针的区别与联系
- 献给杭电五十周年校庆的礼物
- scala安装 scala eclipse插件安装
- 数据结构与算法——归并排序
- 小问题
- java中堆和栈的区别