原型式继承

1
2
3
4
5
function object(o){ // o为一个要作为模板的对象
function F(){} // 新建一个临时构造函数
F.prototype = o; // 让构造函数的原型对象等于传入的对象
return new F(); //返回这个临时类型的一个实例
}

本质上,object()对传入其中的对象执行了一次浅复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var person = {
name : "spike",
friends : ["Jack","Lux","Brandon"]
}
var anotherPerson = object(person);
anotherPerson.name = "Van";
anotherPerson.friends.push = "Frank";
var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Tom";
yetAnotherPerson.friends.push("Joy");
console.log(person.firends); // ['Jack','Lux','Brandon','Frank','Joya']

实际上,anotherPerson和yetAnotherPerson相当于person的两个副本


与object(o) 方法相似的 ,还有 Object.create(),如果只传1个参数(一个对象),那么object(o)和Object.create(o)的行为是相同的。
Object.create()还可以传入第二个参数,第二个参数和Object.defineProperties()方法的第二个参数格式相同,第二个参数定义的属性,会覆盖原型链上的属性。


如果想根据某个已有的对象,构造一个新的对象,让这两个对象保持类似,那么可以考虑这种继承方式。一定要注意引用类型的值是被共享的。