研究到这儿,竟然出现了一个面试题目
var a = { name : '小明'};var b = a;b.name = '小强';alert( a.name );
结果必然是“小强”,原因是对象的引用,两个用的是一个地址,所以只要这个地址里的东西变了,那个两个对象弹出来的自然也要变。
故而这儿存在的是上篇同样的问题。
var a = { name : '小明'};var b = {};extend( b , a );b.name = '小强';alert( a.name );function extend(obj1,obj2){ for(var attr in obj2){ obj1[attr] = obj2[attr]; }}
因此上篇的解决方案就是将 extend的方法加上,并且将
createStar.prototype = createPerson.prototype; 改成 extend(createStar.prototype,createPerson.prototype); 还有一个面试题目:
var a = [1,2,3];var b = a;b.push(4);alert(a); // 1,2,3,4var a = [1,2,3];var b = a;b = [1,2,3,4];alert(a); // 1,2,3
上面这个弹出结果,考察的是对象引用时的问题,对象引用改变了。
下面的弹出结果是,当b重新赋值时,对象应用问题就已经解开了,因为重新赋值时,b就又开了个新的地址,所以a还是1,2,3
所以总结一下,就是如下:
属性的继承 | 方法的继承 |
调用父类的构造函数call | for in 拷贝继承(jquery中就是如此) |