《JavaScript高级程序设计》中讲到用对象冒充可以做继承,里面给出的例子如下:function ClassA(sColor) {
this.color=sColor;
this.sayColor=function() {
alert(this.color);
};
}function ClassB(sColor) {
this.newMethod=ClassA;
this.newMethod(sColor);
delete this.newMethod;
}
这样定义以后,ClassB就继承了ClassA了。书中还提到一句话,“所有的新属性和新方法都必须在删除了新方法的代码行后定义。否则,可能会覆盖超类的相关属性和方法。”也就说,是下面的代码是必须的:delete this.newMethod;
可是我尝试的结果是,就算不要这一句,也覆盖不了超类的属性或方法,所以来请教各位,如果不删除引用,在什么样的情况下可能覆盖父类的属性或者方法?
this.color=sColor;
this.sayColor=function() {
alert(this.color);
};
}function ClassB(sColor) {
this.newMethod=ClassA;
this.newMethod(sColor);
delete this.newMethod;
}
这样定义以后,ClassB就继承了ClassA了。书中还提到一句话,“所有的新属性和新方法都必须在删除了新方法的代码行后定义。否则,可能会覆盖超类的相关属性和方法。”也就说,是下面的代码是必须的:delete this.newMethod;
可是我尝试的结果是,就算不要这一句,也覆盖不了超类的属性或方法,所以来请教各位,如果不删除引用,在什么样的情况下可能覆盖父类的属性或者方法?
delete this.newMethod;只是为了不让实例使用,只在实例化时调用ClassA
这个属性是把ClassA引进来而已新代码是能覆盖原类的属性和方法的, 用
function ClassB(sColor) {
this.newMethod = ClassA;
this.newMethod(sColor);
this.color = sColor + sColor;
//delete this.newMethod;//删不删都无所谓
}new ClassB('red!').sayColor();
试试看.
这样是试不出来的吧?这样相当于是在ClassB中重写了ClassA中的color属性,但并没有覆盖掉ClassA中的color值啊。
用new ClassA('red!').sayColor();就能知道了。
那就是说,没有办法用newMethod来覆盖ClassA中的属性和方法了?那书中的这段话岂不是错误的?
是没有显式地继承, 但事实是..ClassB已经具有了ClassA的属性color和方法sayColor.
你可以覆盖掉这些属性和方法, 并且建立新类的实例来使用你自己重写或者添加的属性和方法
可是重写父类的属性或方法不正是继承的特点么?如果不能覆盖反而不对了。
而且这个重写属性和方法关是不是delete了引用什么关系呢?delete了以后还是可以重写啊。
只是调用了ClassA帮ClassB的实例赋值而已LZ要学习js的继承,请把prototype学习一下
我知道用prototype实现的继承,但这种使用对象冒充的方法也是实现继承的一种手段。现在通常使用的继承是混合了对象冒充和prototype方式实现的,所以不能说不使用prototype就不算真正的继承吧?prototype只适用于继承父类的方法,比如下面的代码:function ClassA(sColor) {
this.color=sColor;
}ClassA.prototype.sayColor=function() {
alert(this.color);
};function ClassB(sColor) {
this.newMethod=ClassA;
this.newMethod(sColor);
delete this.newMethod;
}ClassB.prototype=new ClassA();你说的真正的继承需要使用到prototype是指这样使用么?
但是这样的使用方式还是存在那个问题,为什么一定要delete这一句?如果不删除,会造成什么影响?
LZ既然知道prototype,那知不知道在用prototype方法继承的父类中修改,子类也会改变
而你这种调用的方法是不可能的
是的,这样的纯对象冒充是不能做到这点,所以我也并不认为这种方式是实现继承的最好方式。只是我比较困惑书上那样写诗什么意思。
现在我尝试的结果是,如果是利用的混合方式进行继承,并且不删除newMethod,那么就可以在后面的代码里面通过newMethod为ClassA增加属性或者方法,也就是可以修改ClassA的结构。但如果是纯粹的对象冒充则看不出有什么问题。
因为你只不过是可以通过ClassB的newMethod属性访问ClassA而已. 这就是说,对于建立好新类ClassB,
newMethod属性已经没有任何意义, 无非是在ClassB的属性列表里多出了个newMethod而已
这个,我没太懂是什么意思。现在没在讨论重写/添加/删除父类的属性和方法,我只是想问为什么一定要删除newMethod?如果不删,是不是仅仅在ClassB中多出了一个没必要的方法而已?但其实并不会对ClassA造成太严重的影响?因为书里面提到的影响好像是很严重的啊。是不是书中写的太夸张了?