433 字
2 分钟
继承之原型式继承

原型式继承#

这是一种不涉及严格意义上构造函数的继承方式

这个思路就是,不需要自定义一个类型,就可以通过原型实现对象之间的信息共享

就仍然是为了实现对象之间的信息共享

目标函数如下

function object(o){
function F(){}
F.prototype = o;
return new F();
}

思路如下:

  1. object函数会创建一个 临时 的构造函数在函数作用域内,退出函数就直接销毁的那种
  2. 将传入的对象赋值给这个临时构造函数的原型,然后返回这个临时构造函数的实例

其实本质上是对这个传入的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);

这是最终的打印结果

image-20210531163110860

这里的person, person2, person3之间的数据都是共享的

Object.create()#

ES5将这种原型式继承的概念规范化了。

Object.create()接受两个参数

  1. 作为新对象原型的对象
  2. 给新对象定义的额外属性对象

只有在传第一个参数的时候,Object.create与这里的object()方法一样

Object.create()的第二个参数与Object.defineProperties第二个参数一样:每一个新增的属性都通过各自的描述符来描述。这种方式添加的的属性会遮蔽原型对象上的同名属性

实际上和原型模式一样的,只是不需要显式的去创建构造函数了。适用于需要在对象之间共享信息的场合

继承之原型式继承
https://nollieleo.github.io/posts/继承之原型式继承/
作者
翁先森
发布于
2021-05-31
许可协议
CC BY-NC-SA 4.0