【问题标题】:Make the new keyword optional使新关键字可选
【发布时间】:2012-10-28 03:41:07
【问题描述】:

假设我想创建以下 API:

var api = function(){}

api.prototype = {
  constructor: api,
  method: function() {
    return this;
  }
};

现在,这将像这样工作:

var myApi = new api();
myApi.method();

但是假设我想让 new 关键字可选,这样就可以了:

api().method();

我会疯掉的:

var api = function() {
  if ( !(this instanceof api) ) {
    return new api();
  }
};

但我想知道,这会不会很容易被感染,或者使用这种方法有其他危险吗?我知道 f.ex jQuery 不这样做(他们将构造函数卸载到原型方法),所以我确信不这样做是有充分理由的。我只是不认识他们。

【问题讨论】:

  • 您的解决方案看起来非常好,我已经看到很多地方都在使用它。例如,请参阅here

标签: javascript constructor new-operator javascript-objects


【解决方案1】:

选择一种或另一种约定。如果您想为您的 API 句柄使用对象,但不希望人们必须使用 new,请使用两个函数。 Api() 是对象的构造函数,api() 是一个常规函数,它只返回一个新的 Api 实例。

我认为你的提议没有危险,只是看起来毫无意义,我不喜欢一个函数同时做两件事的想法。

【讨论】:

  • new 设为可选可让团队以符合自己约定的方式使用 API。一些团队强烈反对new,因为它的问题和其他人使用它是因为它与具有继承的语言相似。如果 API 不强迫团队像这样打破他们的约定,那就太好了。 Express.js 的Router 类是可选new 的一个很好的例子。
【解决方案2】:

在构造函数中返回一个对象。

function Car(){
   var obj = Object.create(Car.prototype);
   obj.prop = 1;
   return obj;
}
Car.prototype = {
    method: function (){ }
};

//test
var car1 = Car();
var car2 = new Car();

【讨论】:

  • Object.create(...) 特别好,因为它使用强制而不是询问,并消除了构造函数中对 this 的任何引用,因此您无需推理构造函数上下文中的 this 是什么.方法仍然可以按预期访问this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2012-05-06
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多