Javascript中继承的问题

47522341 2009-11-19 01:39:03
这几天看到了Javascript采用冒充法继承,代码如下:
function classA(sColor) {
this.color = sColor;
this.sayColor = function () {
alert(this.color);
};
}


function classB(sColor, sName) {
this.newMethod = classA;
this.newMethod(sColor);
delete this.newMethod; //所有的新属性和新方法都必须在删除父类构造函数的代码行后定义,否则,可能会覆盖子类的相关属性和方法

this.name = sName;
this.sayName = function () {
alert(this.name);
};
}


var objB = new classB("blue", "name");
objB.sayColor();//blue
objB.sayName();//name

我要提的一个问题是:为什么在ClassB类继承了ClassA之后必须要用 delete this.newMethod;这一句,虽然注释已经说有了它的作用,但是我自己试了一下,如果不用也不会产生什么后果,请高手们能够解释,最好是举例说明?
...全文
122 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
47522341 2009-11-19
  • 打赏
  • 举报
回复
谢谢大家的支持,我应该已经弄清楚了。其实人家的注释中已经说得非常明白了,即:有可能覆盖超类的相关属性和方法,我试了一下,如果通过this.newMethod.prototype对A原型中的一些方法和属性确实能够进行覆盖,开始太晕了,以为能够覆盖ClassA构造函数里面的方法和属性,其实构造函数是在初始化一个实例时才进行的,所以构造函数中的方法和属性是不能够覆盖的。
xiaofan_sap 2009-11-19
  • 打赏
  • 举报
回复

function classB(sColor, sName) {
var a= this.newMethod = classA;
var b= this.newMethod(sColor);
alert(a==b)
delete this.newMethod;
alert(typeof a)
alert(typeof b)
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}

看看这个 应该明白了
有空看看这个帖子http://tech.idv2.com/2008/01/09/javascript-variables-and-delete-operator/
漫漫2009 2009-11-19
  • 打赏
  • 举报
回复
注释貌似错了额,应该是 有可能覆盖超类的相关属性和方法。
this.newMethod = classA; 函数名只是指向它的指针,这里this.newMethod也就是相当于一个指针指向了classA这个构造函数,不删除的话就可以通过这个指针修改classA里面的属性和方法。
Objector 2009-11-19
  • 打赏
  • 举报
回复
delete掉newMethod属性后,classB就彻底和classA没关系了。
不然以后classB的默写涉及到newMethod属性的操作可能会影响到classA
cloudgamer 2009-11-19
  • 打赏
  • 举报
回复
不delete的话通过objB.newMethod就可以修改classA了

87,907

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧