在Javascript中使用不带新关键字的自定义对象的instanceof

时间:2014-08-24 15:16:18

标签: javascript

我有一个工厂函数,它应该返回创建对象实例的函数。相当简化它看起来像这样。

var Factory = function() {
  var factoryPrototype = {};
  var TypeFunction = function() {
    return Object.create(factoryPrototype);
  };
  return TypeFunction;
};

然后我可以简单地调用Factory()来获取我可以用来引用该特定类型的函数。

问题是,我怎么能允许instanceof运营商呢?

var Mytype = Factory();
console.log(MyType instanceof Factory);

根据我的理解,运营商正在比较MyType.__proto__Factory.prototype。我可以像这样管理第一部分。

Object.setPrototypeOf(TypeFunction, Factory);

它没有错误,功能本身正常工作。第二部分是失败点。我只能做Factory.prototype = Factory,但这看起来很脏,我宁愿不...还有其他一些更好的"方式是什么?

无论哪种方式,在使用最后一次通话后,我都可以使用Factory.isPrototypeOf(MyType),它可以正常工作,现在可能只有干净方式......

您如何看待修改原型功能链?可能会有一些我不明白的副作用吗?

更新

基于@SLaks解决方案,我更加深入并将模式应用于实际实例。http://jsfiddle.net/FredyCr/egbfyood/1/

1 个答案:

答案 0 :(得分:0)

你需要让你的新函数继承自Factory:

Object.setPrototypeOf(TypeFunction, Factory.prototype);

但是,这会丢失您从Function.prototype继承的所有内容,例如callbind

因此,您还需要确保Factory.prototype包含它们:

Factory.prototype = Object.create(Function.prototype);