Javascript Crockford构造函数:作为自己的属性而不是附加到`\u proto__`

Javascript Crockford构造函数:作为自己的属性而不是附加到`\u proto__`,javascript,Javascript,标题听起来可能有点混乱。请允许我将Crockford的构造函数转换到下面的简单示例中,并使用两种不同的方法创建对象。(浏览器是FireFox。) 正如Crockford指出的,创建对象的一种方法是使用object.create方法 myCar = Object.create(car({maker: 'Nissan', year: 2004})); console.log(myCar); // Object {}, on FireFox console. 方法getMaker和getYear附加

标题听起来可能有点混乱。请允许我将Crockford的构造函数转换到下面的简单示例中,并使用两种不同的方法创建对象。(浏览器是FireFox。)

正如Crockford指出的,创建对象的一种方法是使用
object.create
方法

myCar = Object.create(car({maker: 'Nissan', year: 2004}));
console.log(myCar); // Object {}, on FireFox console.
方法
getMaker
getYear
附加到
\uuuuuuuuuuuuuuu

另一种方法是调用
car
,让它返回一个对象

yourCar = car({maker: 'Ford', year: 2010});
console.log(yourCar); // Object { getMaker: car/that.getMaker(), getYear: car/that.getYear() }
方法
getMaker
getYear
成为对象
yourCar
的自身属性


我的问题是:从这个“Crockford构造函数”创建对象的这两种方法的优缺点是什么

调用
对象没有任何意义。当您已经拥有所需的完整对象时,创建
。只有当多个对象共享公共属性时,继承才有用,但是在您的示例中,
getMaker
getYear
是每个汽车实例的自己的属性。

\uuuuuuuuu
prototype
中拥有方法的优点是创建的对象的多个副本将指向相同的方法。这意味着每个方法只创建一个副本。较少(相对)使用内存。如果方法附加到对象本身,那么每个对象都将有自己的方法副本。

感谢您指出这一点。但是我问了一个不同的问题。@Xavier我同意
对象.create
没有意义,因为
car
的调用已经返回了真正不同的对象(没有重叠属性)。@PanJunjei对于这个具体的例子,我也同意Bergi的观点。但是,这不是问题。@Xavier当时的问题是什么?我以为你是在要求比较代码片段中对象构造的两种方式。@Bergi说得对。示例太简单,无法包含可能的“继承”行为。这个问题可以更好地重新表述为:如何将属性附加到proptotype链与将它们指定为自己的属性进行比较,您基本上是说,在这个场景中,
Object.create
应用于这个Crockford风格的构造函数,与依赖于
.prototype
new
的更传统的方法是一样的。这是一个正确的特征描述吗?在某种程度上,如果您创建的实例没有任何继承,那么是的。否则,这里有一个很好的答案()关于使用
对象。为继承创建
。很好的帖子。也许我更喜欢“委派”而不是“继承”。我的观察是,在JavaScript中,这个术语“继承”为原型链查找完成的底层“委托”加上了糖衣。
yourCar = car({maker: 'Ford', year: 2010});
console.log(yourCar); // Object { getMaker: car/that.getMaker(), getYear: car/that.getYear() }