弄清楚变量是否是函数原型的实例

时间:2017-12-05 19:52:40

标签: javascript

说我有

function Foo() {
    // stuff
} 

Foo.prototype.bar = function() {
    return new Bar();
}

function Bar() {};

module.exports = Foo;

现在说我有

const foo = new Foo();
console.log(foo instanceof Foo); // true

const bar = new Foo().bar();
console.log(bar instanceof Foo); // false
console.log(bar instanceof Foo.prototype.bar); // false

此处Bar永远不会导出。那么如何测试bar是否是......的一个实例?我可以以某种方式拥有bar instanceof Foo或Foo的子集吗?

2 个答案:

答案 0 :(得分:1)

默认情况下,Bar功能constructor可用Bar.prototype new Bar(),该constructor位于bar instanceof new Foo().bar().constructor 的原型链中。 (这基本上是Bar在实践中唯一有用的东西。)

Bar.prototype.constructor

相反,如果您想要以这种方式泄露delete构造函数,则可以使用新值(或{{{{{{{导出Foo之前{1}}。如果以这种方式清除了constructor,您仍然可以检查对象的原型链是否包含与新创建的Bar实例相同的原型:

var barProto = Object.getPrototypeOf(new Foo().bar());
var isBar = barProto.isPrototypeOf(bar);

答案 1 :(得分:0)

您可以将一个酒吧的原型与另一个酒吧的原型进行比较:

 Object.getPrototypeOf(bar) === Object.getPrototypeOf((new Foo).bar())