函数是对象,Function出来的实例对象,函数名保存的是地址,指向的是函数值,引用类型,当比较的时候是比较的地址是否相同,赋值的时候是重新分配一个地址,指向一个函数对象!
1.会覆盖的情况:
var a={
name:"sun",
age:"18",
show:function(){
alert(this.name);
}
};
a.show();//"sun"
var b=a;
b.show=function(){
alert(this.age);
};//覆盖同一个show方法
b.show(); //18
a.show(); //18
function a(){
alert("a");
}
var b=a;
b=function(){
alert("b");
}
a();//"a",b赋值的时候,是重新生成一个地址,和a没有关系
2.不会覆盖的:
function AA(){
this.name="小明";
this.arr=[1,2.3];
}
AA.prototype.new=function(){}
var aa=new AA();
aa.name="xiaoMing";
var bb=new AA();
alert(bb.name);//还是"小明",不同的地址,相同的对象值
function A(){
this.name = 'wangmeijian';
this.age = 23;
}
A.prototype.showname = function(){
alert( this.name )
};
function B(){
A.call(this)
}
var a = new A();
B.prototype = a;
B.prototype.showname=function()
{
alert(this.age)
};//这个地方的赋值,是给B的原型加一个属性,保存一个函数的地址,并不会改变A下面的showname
//当B.prototype=a;时,B.prototype.showname=a.showname,给a对象直接加了一个属性,保存一个函数的地址;其实这个时候A.prototype.showname应该还是存在的,没有改变。
//a.showname(); //wangmeijian
var b = new B();
//b.showname(); //23
alert(A.prototype.showname);/*function(){
alert( this.name )
}*/
alert(a.showname);/*function()
{
alert(this.age)
}*/