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明明删除了newMethod,为什么ClassB实例化的对象依然可以引用ClassA的方法呢?
ClassB明明删除了newMethod,为什么ClassB实例化的对象依然可以引用ClassA的方法呢?
首先先纠正一下楼主。。b.sayColor()不是调用ClassA的方法,而是调用ClassB的方法,与A没关系的
因为在
this.newMethod=ClassA;
this.newMethod(sColor);
这里ClassB已经把ClassA的所有成员变量都拷贝完了。。记住是拷贝,不是引用看下下面例子就知道了
var ClassA = function (sColor) {
this.color = sColor;
this.sayColor = function() {
alert(this.color);
};
}
function ClassB(sColor) {
this.newMethod=ClassA;
this.newMethod(sColor);
delete this.newMethod;
}function ClassB(sColor) {
this.newMethod=ClassA;
this.newMethod(sColor);
delete this.newMethod;
}var b = new ClassB("red");ClassA = function(){} //修改ClassA为一个空的函数b.sayColor();//red
function ClassB(sColor) {
this.newMethod=ClassA; //this.newMethod的引用指向ClassA
this.newMethod(sColor); //调用newMethod方法
delete this.newMethod; //删除newMethod引用
}调用newMehtod执行结束后才delete this.newMethod。
每次实例化的时候都会先执行 this.newMethod=ClassA,给ClassB添加了newMethod方法, 所以this.newMethod可定可以执行啊
this.xxx这些是存放到实例单独副本中的,无论构造函数怎么改变都不会影响到var Person = function (name){
this.name = name;
}var p = new Person("csdn");Person = function(){
this.name = "111"
}alert(p.name)