有没有理由在JavaScript中使用Object.create()或new?

Tow*_*wer 8 javascript ecmascript-5 object-create

new到目前为止,我一直在使用JavaScript中的关键字.我一直在阅读Object.create,我想知道是否应该使用它.我不太明白的是我经常需要运行构造代码,因此我看不到Object.create它将如何工作,因为它不会触发任何运行的函数.

谁能告诉我,在哪种情况下我应该使用Object.create而不是new

Fel*_*ing 13

到目前为止,如果要创建对象,则只能使用文字:

var obj = {};
Run Code Online (Sandbox Code Playgroud)

Object构造函数.

var obj = Object();
Run Code Online (Sandbox Code Playgroud)

但是这些方法都不允许您指定所创建对象的原型.

这就是你Object.create现在可以做的.它允许您创建新对象并将第一个参数设置为新对象的原型.此外,它允许您设置作为第二个参数提供的新对象的属性.

它类似于做这样的事情(没有第二个参数):

function create(proto) {
    var Constr = function(){};
    Constr.prototype = proto;
    return new Constr();
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您正在使用类似于此的构造,那么当您想要使用时Object.create.

它不是替代品new.它更像是一个创建单个对象的补充,它应该更容易从另一个对象继承.

例:

我有一个对象a:

var a = {
   someFunction: function() {}
};
Run Code Online (Sandbox Code Playgroud)

我想b扩展这个对象.然后你可以使用Object.create:

b = Object.create(a);
b.someOtherFunction = function(){};
Run Code Online (Sandbox Code Playgroud)

只要你有一个构造函数,但是你只从中实例化一个对象,你就可以用它替换它Object.create.

适用的一般规则.它在很大程度上取决于构造函数的作用以及如何从其他对象继承等.

  • @jfriend00:如果构造函数的唯一目的是创建一个从另一个对象继承的空对象,那么你将使用`Object.create`. (6认同)

Eri*_*ott 5

正如已经提到的,Object.create()当您想要一种简单的方法来设置新对象的原型时,通常会使用它。但其他答案没有提到的是,构造函数(需要 new)与任何其他函数并没有什么不同。

事实上,任何函数都可以返回一个对象,并且在 JavaScript 中常见工厂函数(如构造函数,但它们不需要new或 usethis来引用新对象)。工厂函数经常用来Object.create()设置新对象的原型。

var barPrototype = {
  open: function open() { /* ... */ },
  close: function close() { /* ... */ },
};
function createBar() {
  return Object.create(barPrototype);
}

var bar = createBar();
Run Code Online (Sandbox Code Playgroud)