Object.create 相对于构造函数的实际优势是什么?

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

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

试图理解函数构造函数模式和 Object.create 模式之间的区别,涉及到:

  1. 范围:私有和特权方法
  2. 何时在应用程序中使用 which

函数构造函数我可以创建私有函数和方法如下:

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 

好处:

  1. 函数构造函数模式允许创建 public 和私有 方法。
  2. 我可以访问 Human.prototype 属性。
    • 子对象指的是人类原型__proto__ -> [[prototype]] (?)

Object.create我只能:

  1. 创建一个对象并设置其原型,即 __proto__ 为 Human 对象(而不是人类的原型)

那又怎样? 直接将儿童原型设置为人类构造函数的实用优点是什么?

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

调用构造函数:

 const child = new Human();

与(几乎)相同:

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

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

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

的反序列化
 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));