Object.create 相对于构造函数的实际优势是什么?
What is a practical advantage of Object.create over Constructor function?
所以我来自经典的 OOP 语言,并试图围绕 javascript 原型风格。
试图理解函数构造函数模式和 Object.create 模式之间的区别,涉及到:
- 范围:私有和特权方法
- 何时在应用程序中使用 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
好处:
- 函数构造函数模式允许创建 public 和私有
方法。
- 我可以访问 Human.prototype 属性。
- 子对象指的是人类原型
__proto__
-> [[prototype]]
(?)
Object.create我只能:
- 创建一个对象并设置其原型,即
__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));
所以我来自经典的 OOP 语言,并试图围绕 javascript 原型风格。
试图理解函数构造函数模式和 Object.create 模式之间的区别,涉及到:
- 范围:私有和特权方法
- 何时在应用程序中使用 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
好处:
- 函数构造函数模式允许创建 public 和私有 方法。
- 我可以访问 Human.prototype 属性。
- 子对象指的是人类原型
__proto__
->[[prototype]]
(?)
- 子对象指的是人类原型
Object.create我只能:
- 创建一个对象并设置其原型,即
__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));