uber属性:
js本身并没有这个属性。“uber”是某些人在模拟class时用来表示super的(因为super是关键字所以不能直接用)。
经典的面向对象语言一般都有访问父类(超类)的特殊语法,这样子类的方法就可以使用父类的方法了,子类和父类的方法同名。
现代JavaScript中,没有这种特殊语法,uber可以实现这一功能,但是繁琐一些。
一:浅拷贝
拷贝就是把父对像的属性,全部拷贝给子对象。
下面这个函数,就是在做拷贝:
var Chinese={
nation:"中国",
birthPlaces:["北京","上海"]
}
var Doctor={
career:"医生"
}
function extendCopy(p) {
var c={};
for(var k in p){
c[k]=p[k];
}
c.uber=p;
return c;
}
使用的时候,这样写:
var doctor=extendCopy(Chinese);
doctor.career="医生";
console.log(doctor);
该拷贝问题:如果父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。
示例如下:
doctor.birthPlaces.push("西安");
console.log(doctor.birthPlaces);//[ '北京', '上海', '西安' ]
console.log(Chinese.birthPlaces);//[ '北京', '上海', '西安' ]
结果两个的出生地都被改了。所以,extendCopy() 只是拷贝了基本类型的数据,我们把这种拷贝叫做“浅拷贝”。
二、深拷贝
function deepClone(parent, child) {
var i,
toStr = Object.prototype.toString,
astr = "[object Array]";
child = child || {};//第二个参数省略,默认c为对象
for (i in parent) {
if (parent.hasOwnProperty(i)) {
if (typeof parent[i] == "object") {
child[i] = toStr.call(parent[i]) === astr ? [] : {};
deepClone(parent[i], child[i]);
} else {
parent[i] = child[i];
}
}
}
return child;
}
如果p为数组,则需传递第二个参数为[];否则p为对象,c可省略。对于数组可以使用for in循环,但是判断属性是否存在的函数hasOwnProperty()只能
对象使用,数组不能使用。
参考:http://www.jb51.net/article/91906.htm