JS基本数据类型有undefined,boolean,number,string,null,是传值赋值。
除此之外JS的其它类型都是引用类型,变量中存的不是值,而是地址。
var A = {
a: function() {
console.log("改变之前");
}
}
var B = { }
B.a = A.a;
B.a(); // 改变之前
A.a = function() {
console.log("改变之后");
}
B.a(); // 改变之前
代码中很简单很常见也很容易出错的例子,对吧?
A.a,B.a都只是一个变量,存储着function(){}对象的地址,B.a = A.a,实际上是将A.a存的地址复制给B.a,当A.a存储的地址改变后,不会影响B.a的地址,B.a存的地址仍然是之前A.a赋给它的,不要误认为B.a指向A.a,A.a指向function!
其实我最近在研究es5中的继承机制,碰到复制原型的继承方法时产生这个困惑,记录一下这个问题,也算为我之后准备写的一篇关于es5中原型链继承和断开原型链的复制继承做个铺垫。