关于javascript:Object.create比Constructor函数有什么实际优势?

What is a practical advantage of Object.create over Constructor function?

本问题已经有最佳答案,请猛点这里访问。

所以我来自古典的OOP语言,并试图围绕javascript原型风格。

尝试理解函数构造函数模式和Object.create模式之间的区别:

  • 范围:私有和特权方法
  • 何时使用哪种应用程序
  • 函数构造函数我可以创建私有函数和方法,如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function Human() {
      this.public ="public accessible variable";
      let private ="private only accessible inside Human";
    }
    Human.prototype.speak ="hahahaha";

    var child = new Human();
    Console.log(child.public) // prints
    console.log(child.private) // don't print

    优点:

  • 函数构造函数模式允许创建公共和私有
    方法。
  • 我可以访问Human.prototype属性。

    • 子对象是指人类原型__proto__ - > [[prototype]](?)
  • Object.create我只能:

  • 创建一个对象并将其原型设置为__proto__到Human
    对象(而不是Human的原型)
  • 但那又怎么样?将child的原型直接设置为人类构造函数有什么实际优势?

    实际使用的例子会有所帮助!


    调用构造函数:

    1
     const child = new Human();

    是(几乎)相同:

    1
    2
     const child = Object.create(Human.prototype);
     Human.call(child);

    因此,我不会将Object.create视为语言特性,而是将其视为理解JS中原型继承的一种方式。

    没有构造函数的原型链的用例非常有限。 一个例子是Human的反序列化:

    1
    2
    3
     const serialized = JSON.stringify(child); // Human inheritance gets lost, its a plain object now

     const child2 = Object.assign(Object.create(Human.prototype), JSON.parse(serialized));