7

假设我想创建以下 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 不这样做(他们将构造函数卸载到原型方法),所以我确信有充分的理由不这样做。我只是不认识他们。

4

2 回答 2

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();
于 2014-11-19T06:54:19.810 回答
-1

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

我认为您的建议没有危险,这似乎毫无意义,我不喜欢一个函数同时做两件事的想法。

于 2012-11-08T00:31:46.567 回答