非构造函数的继承和拷贝
一、object()方法(不够完善)
只能用于对象:
var Chinese = {
nation:'中国'
};
var Doctor ={
career:'医生'
};
function object(parent) {
function F() {}
F.prototype = parent;
return new F();
}
Doctor = object(Chinese);
console.log(Doctor.nation); //中国
二、浅拷贝(不够完善)
对象的浅拷贝:
var Chinese = {
nation:'中国',
birthPlaces:['北京','上海','香港']
};
var Doctor ={
career:'医生'
};
function extendCopy(p) {
var c = {};
for (var i in p) { //子对象获得的只是一个内存地址,而不是内容
c[i] = p[i];
}
//c.uber = p;
return c;
}
Doctor = extendCopy(Chinese);
console.log(Doctor.nation); //中国
Doctor.birthPlaces.push('厦门');
console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
console.log(Chinese.birthPlaces); //北京, 上海, 香港, 厦门
//父对象也被篡改了。第一点的object()方法也同样存在这个问题。也可以看成对象的浅拷贝。
数组的浅拷贝:
//1
var arr2 = arr1.slice();
//2
var arr2 = arr1.concat();
通用浅拷贝函数:
var simpleCopy = function(o){
if (o instanceof Array) { //数组浅拷贝
var n = [];
for (var i = 0; i < o.length; ++i) { //注意是++i,先加再执行
n[i] = o[i];
};
return n;
} else if (o instanceof Object) { //对象浅拷贝
var n = {};
for (var i in o) { //对象遍历要用for in
n[i] = o[i];
};
return n;
}
}
注意直接用等号并不是浅拷贝,而是相等,修改任意一项都会有影响。
三、深拷贝
对象的深拷贝:
var Chinese = {
nation:'中国',
birthPlaces:['北京','上海','香港']
};
var Doctor ={
career:'医生'
};
function deepCopy(p, c) {
var c = c || {}; //这里决定了返回的是对象
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}
Doctor = deepCopy(Chinese);
console.log(Doctor.nation); //中国
Doctor.birthPlaces.push('厦门');
console.log(Doctor.birthPlaces); //北京, 上海, 香港, 厦门
console.log(Chinese.birthPlaces); //北京, 上海, 香港
对象的深拷贝:(最简单)
var obj2 = JSON.parse(JSON.stringify(obj));
通用深拷贝函数:
var deepCopy = function(o) {
if (o instanceof Array) { //一定要把Array判断放在Object判断上面
var n = [];
for (var i = 0; i < o.length; ++i) {
n[i] = deepCopy(o[i]);
};
return n;
} else if (o instanceof Object) {
var n = {};
for (var i in o) {
n[i] = deepCopy(o[i]);
};
return n;
} else { //返回o
return o;
}
}