Javascript 从新建转换为Object.create()

Javascript 从新建转换为Object.create(),javascript,Javascript,我最近发现了关于new与Object.create()的整个争论。通过使用new执行大量OO,我学会了如何解决问题的某些模式。为了学习一些不同的东西,我想我应该将一些简单的“经典OO”代码重写为Object.create()风格 我遇到了嵌套对象的问题,例如 新的 函数库(){ this.name={first:'',last:''}; } var a=新基(); var b=新基(); a、 name.first='Sally'; a、 name.last='Broker'; b、 nam

我最近发现了关于
new
Object.create()
的整个争论。通过使用
new
执行大量OO,我学会了如何解决问题的某些模式。为了学习一些不同的东西,我想我应该将一些简单的“经典OO”代码重写为
Object.create()
风格

我遇到了嵌套对象的问题,例如

新的


函数库(){
this.name={first:'',last:''};
}
var a=新基();
var b=新基();
a、 name.first='Sally';
a、 name.last='Broker';
b、 name.first='Peter';
b、 name.last='Davis';
document.write('first:',a.name.first,“last:”,a.name.last);//输出{first:'Sally',last:'Broker'}
文件。写(“
”);
document.write('first:',b.name.first,“last:”,b.name.last);//输出{first:'Peter',last:'Davis'}
这两个版本不相等。在
new
案例中,您直接将“name”属性放在构造的实例上。当您像这样使用
Object.create()
时,您并没有这样做,而是希望从原型继承“name”。因此,对“name”对象属性的后续赋值会影响共享原型版本。(换句话说,
a.name
b.name
都是指完全相同的对象。)

要使用
Object.create()
创建与
new
场景大致相同的版本,请执行以下操作:

var a = Object.create(Object.prototype, {
  name: {
    value: { first: "John", last: "Doe" },
    writable: true,
    enumerable: true
  }
});
或者,更简单地说:

var a = Object.create(Object.prototype);
a.name = { first: "John", last: "Doe" };

值得一提的是,
new
通常比Object.create更快,产生更好的堆栈跟踪,因为据我所知,调试器无法用文字命名创建的对象。我希望您已经了解了原型继承
对象。create
设置了原型,而实际上您并没有这样做这箱子有什么问题吗。基本实例的原型没有任何意义。@BenjaminGruenbaum这主要是为了加深我对JavaScript的理解而进行的个人练习,但我很感谢您对为什么选择
new
的评论。谢谢。是的,我理解引用共享原型版本的部分。然而,我的问题更多地围绕着在编码时我应该如何以不同的方式思考。现在,创建一个具有属性的类非常容易,这些属性包含的对象反过来又具有属性。对于原型继承,我需要重新思考方法。你能告诉我你会怎么做吗?(还是我问了一个毫无意义的问题?@marcusstenbeck这真的是一个不同的问题;
new
Object.create()
之间没有影响原型继承工作方式的差异;这两种情况下的机制是相同的。在您的第一个
new
示例中,根本没有继承(除了对象原型的隐式继承)。感谢您更新和添加上下文。创建一个包含名字和姓氏的新对象的过程在做很多事情时有点繁琐,所以…工厂函数通常会包含初始化代码吗?我更新了这个问题,以反映我不是真的在寻找继承,但是更多的是关于经典OO与……我不知道该怎么称呼它。@marcusstenbeck首先要理解的是,你真的不能在JavaScript中进行“经典”继承。您可以在某些方面模仿这种行为,但底层JavaScript机制是完全不同的。你所拥有的只是原型遗传。如果你环顾四周,就会发现有无数关于JavaScript继承的书籍、博客文章和教程。