part 1 、非构造函数的继承
假如有一个对象 parent 需要被继承
var parent = {
p1: '属性1',
p2: '属性2'
}
方式1:直接复制属性
即直接遍历 parent 的属性赋值给另一个对象,实现继承
function copyObj(p){
var c = {};
for(var i in p){
c[i] = p[i];
}
return c;
}
创建复制对象
var child = copyObj(parent);
console.log(child.p1,child.p2);//属性1 属性2
复制属性成功。
需要注意的是,当 parent 属性值为复杂数据类型(Object)时, child 并没有复制该属性值,而是采取了引用的形式。这与js的数据类型有关(此处不赘述,会另外写一篇博客说明)。
具体表现为,child 所引用属性值的修改会影响 对应的 parent 的属性值,反之亦然。
若不想让 parent 属性值受到影响,需要在 child 中复制出该属性值,此时可采用 ‘迭代递归’ 实现,如
function deepCopyObj(p, c) {
var c = c || {}; //c参数未传入时新建c,有传入值时使用传入值
for (var i in p) {
if (typeof p[i] === 'object') {
c[i] = (p[i].constructor === Array) ? [] : {};
deepCopyObj(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}
方式2:利用构造函数的prototype属性
思路:
a: 新建一个构造函数 Foo;
b: 将构造函数 Foo 的原型对象 prototype 赋值为 parent;
c: Foo 生成实例。
function copy2(p) {
function F(){}
F.prototype = p;
return new F();
}
//复制 parent
var child = copy2(parent);
console.log(child.p1);//属性1