Javascript继承实现方式
来源:互联网 发布:杭州橙群网络怎么样 编辑:程序博客网 时间:2024/05/22 14:16
1.对象冒充方式:
a.能够实现多继承
b.子类的新属性及新方法必须在父类对应的临时方法执行及删除后才能够添加,否则会被父类覆盖。
c.只能继承通过构造函数this.方式定义的属性及方法,不能继承通过原型方式prototype.定义的属性及方法
d.不能使用instanceof来检验子类对象与父类的关系。
function ClassA(){
this.prop1 = "aaaa";
...
this.method1 = function(){...};
};
ClassA.prototype.method2 = function(){
....
};
function ClassB(){
this.tempMethod = classA;
this.tempMethod();
delete this.tempMethod;
this.propb = "asdf";
};
var obj = new ClassB();
obj.prop1 = "asdf"; //ok
obj.propb = "asdfa"; //ok
obj.method1(); //ok
obj.method2(); //error
2.call方式:针对对象冒充方式设置的一个函数,为了简化其实现,所以优缺点完全如同1.
function ClassA(val1,val2){
this.prop1 = val1;
this.prop2 = val2;
....
this.method1 = function(){...};
};
function ClassB(val1,val2,valb){
//this.tempMethod = classA;
//this.tempMethod();
//delete this.tempMethod;
ClassA.call(this,val1,val2);
this.propb = valb;
};
3.apply方式:call方式的一个变形用法,唯一的区别是call方式可以自由传递参数而apply只能传递一个参数数组或者arguments本身,参数数组或者arguments本身的顺序必须与方法的参数顺序一致。
4.原型链方式:
a.解决对象冒充方式不能继承父类通过原型prototype方式定义的方法及属性。
b.父类属性方法不管是用构造函数this.定义还是原型方式定义都能被子类继承到。
c.子类的通过原型方式定义的属性及方法必须在ChildClass.prototype = new ParentClass();语句后定义,否则会被清空。
d.支持instanceof方法
e.不支持多重继承。
f.原型链继承方式的缺陷:父类构造函数必须没有参数且不能实现多种继承。
function ClassA()
{
this.prop1 = "aaa";
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(){
this.propB = "bbb";
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
5.混合方式:集合对象冒充方式及原型链方式来解决父类构造方法没有参数的缺陷,是比较完美的继承解决方案。
function ClassA(val1,val2)
{
this.prop1 = val1;
this.prop2 = val2;
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(val1,val2,valb){
ClassA.call(this,val1,val2);
this.propB = valb;
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
a.能够实现多继承
b.子类的新属性及新方法必须在父类对应的临时方法执行及删除后才能够添加,否则会被父类覆盖。
c.只能继承通过构造函数this.方式定义的属性及方法,不能继承通过原型方式prototype.定义的属性及方法
d.不能使用instanceof来检验子类对象与父类的关系。
function ClassA(){
this.prop1 = "aaaa";
...
this.method1 = function(){...};
};
ClassA.prototype.method2 = function(){
....
};
function ClassB(){
this.tempMethod = classA;
this.tempMethod();
delete this.tempMethod;
this.propb = "asdf";
};
var obj = new ClassB();
obj.prop1 = "asdf"; //ok
obj.propb = "asdfa"; //ok
obj.method1(); //ok
obj.method2(); //error
2.call方式:针对对象冒充方式设置的一个函数,为了简化其实现,所以优缺点完全如同1.
function ClassA(val1,val2){
this.prop1 = val1;
this.prop2 = val2;
....
this.method1 = function(){...};
};
function ClassB(val1,val2,valb){
//this.tempMethod = classA;
//this.tempMethod();
//delete this.tempMethod;
ClassA.call(this,val1,val2);
this.propb = valb;
};
3.apply方式:call方式的一个变形用法,唯一的区别是call方式可以自由传递参数而apply只能传递一个参数数组或者arguments本身,参数数组或者arguments本身的顺序必须与方法的参数顺序一致。
4.原型链方式:
a.解决对象冒充方式不能继承父类通过原型prototype方式定义的方法及属性。
b.父类属性方法不管是用构造函数this.定义还是原型方式定义都能被子类继承到。
c.子类的通过原型方式定义的属性及方法必须在ChildClass.prototype = new ParentClass();语句后定义,否则会被清空。
d.支持instanceof方法
e.不支持多重继承。
f.原型链继承方式的缺陷:父类构造函数必须没有参数且不能实现多种继承。
function ClassA()
{
this.prop1 = "aaa";
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(){
this.propB = "bbb";
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
5.混合方式:集合对象冒充方式及原型链方式来解决父类构造方法没有参数的缺陷,是比较完美的继承解决方案。
function ClassA(val1,val2)
{
this.prop1 = val1;
this.prop2 = val2;
...
}
ClassA.prototype.method1 = function(){....};
function ClassB(val1,val2,valb){
ClassA.call(this,val1,val2);
this.propB = valb;
...
}
ClassB.prototype = new ClassA();
ClassB.prototype.propc = "asd";
ClassB.prototype.method2 = function(){...};
var objB = new ClassB();
objB.prop1 = "adsfasd"; //ok
objB.method1(); //ok
objB.method2(); //ok
0 0
- javascript 继承实现方式
- javascript 继承实现方式
- Javascript继承实现方式
- javascript【继承实现方式 】
- JavaScript继承实现方式一览
- javascript实现继承的方式
- javascript实现继承的方式
- javascript实现继承主要方式
- javascript实现继承的方式
- Javascript继承的实现方式
- javascript实现继承的多种方式
- javascript几种实现继承方式
- javascript中的继承的实现方式
- javascript使用call方式实现对象继承
- Javascript 实现继承的三种方式
- JavaScript 中继承实现方式归纳
- JavaScript 中继承实现方式归纳
- JavaScript使用伪造方式实现继承
- [BBS] Post.jsp 06
- Android不支持web页滚动
- Field requires API level 5 (current min is 1) 问题的解决
- Disruptor为什么会比BlockingQueue更快?
- 如何使用 CSS3 伪类
- Javascript继承实现方式
- 全面介绍ASP.NET和JSP技术
- 跟我一起写 Makefile(七)
- SQLite3常用命令
- Best Practices for Speeding Up Your Web Site
- hadoop完全分布式集群安装
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
- E2034 Cannot convert void (_fastcall * (_closure ) (TCustomGridEh *, TGridEhCellMouseEvent
- toggbutton