本系列文章是本人学习相关知识时所积累的笔记,以记录自己的学习历程,也为了方便回顾知识;故文章内容较为随意简练,抱着学习目的来的同学务必转移他处,以免我误人子弟~

学习js高程3,在对象继承章节提到道格拉夫的object()函数,可以实现对象继承,object() 函数很简单:

  1. // object()
  2. function object(proto) {
  3. function F() { };
  4. F.prototype = proto;
  5. return new F();
  6. }

以传入对象为原型,创建一个临时类(F)的实例对象(new F())并返回该实例;

ES6的Object.create()实现了道爷object()函数的功能

  1. Object.create(proto, [propertiesObject])
  2. /*
  3. proto
  4. 新创建对象的原型对象。
  5. propertiesObject
  6. 可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性
  7. (即其自身定义的属性,而不是其原型链上的枚举属性);
  8. 对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
  9. */

分析

  1. object(proto); Object.create 或 object 接收一个非空对象
  2. function F(){}; 创建一个构造函数(类)
  3. F.prototype = proto; 以传入的对象作为构造函数(类)的原型对象
  4. return new F(); 创建类的实例并返回

例子

  1. function Machine(name) {
  2. this.name = name;
  3. }
  4. Machine.prototype.constructor = Machine;
  5. Machine.prototype.sayName = function () {
  6. console.log(`my name is ${this.name}`);
  7. }
  8. function object(o) {
  9. function F() { };
  10. F.prototype = o;
  11. return new F();
  12. }
  13. function Motor(name, year) {
  14. Machine.call(this, name); // 继承 Machine 的属性
  15. this.usedYear = year;
  16. };
  17. Motor.prototype = Object.create(Machine.prototype);
  18. // 或 Motor.prototype = object(Machine.prototype);
  19. Motor.prototype.construtor = Motor;