433 字
2 分钟
继承之原型式继承
原型式继承
这是一种不涉及严格意义上构造函数的继承方式
这个思路就是,不需要自定义一个类型,就可以通过原型实现对象之间的信息共享
就仍然是为了实现对象之间的信息共享
目标函数如下
function object(o){ function F(){} F.prototype = o; return new F();}思路如下:
- object函数会创建一个 临时 的构造函数在函数作用域内,退出函数就直接销毁的那种
- 将传入的对象赋值给这个临时构造函数的原型,然后返回这个临时构造函数的实例
其实本质上是对这个传入的object进行一次浅复制
function object(o) { function F() {} F.prototype = o; return new F();}
let person = { name: "weng", numbers: [1, 2, 3, 4],};let person2 = object(person);person2.name = "kaimin";person2.numbers.push(5);
let person3 = object(person);person3.name = "helloworld";person2.numbers.push(6);
console.log(Object.getPrototypeOf(person));console.log(Object.getPrototypeOf(person2));console.log(Object.getPrototypeOf(person3));
console.log(person2.name);console.log(person3.name);
console.log(person3.numbers);
console.log(person.name);console.log(person.numbers);这是最终的打印结果

这里的person, person2, person3之间的数据都是共享的
Object.create()
ES5将这种原型式继承的概念规范化了。
Object.create()接受两个参数
- 作为新对象原型的对象
- 给新对象定义的额外属性对象
只有在传第一个参数的时候,Object.create与这里的object()方法一样
Object.create()的第二个参数与Object.defineProperties第二个参数一样:每一个新增的属性都通过各自的描述符来描述。这种方式添加的的属性会遮蔽原型对象上的同名属性
实际上和原型模式一样的,只是不需要显式的去创建构造函数了。适用于需要在对象之间共享信息的场合