在Javascript中使用instanceof自定义对象而不使用new关键字

Using instanceof for custom object without new keyword in Javascript

本文关键字:关键字 对象 new instanceof Javascript 自定义      更新时间:2023-09-26

我有一个工厂函数,它应该返回函数来创建对象的实例。很简单,它是这样的。

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/

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

Object.setPrototypeOf(TypeFunction, Factory.prototype);

但是,这将失去从Function.prototype继承的所有内容,例如callbind

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

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