1

这个小宝石让我有点头疼。假设我创建了一个返回函数的对象,如下所示:

function Bar(prop) {
    this.prop = prop;
    var that = this;
    return function() {
        this.prop = that.prop;
    }
}

var bar = new Bar();
console.log(bar instanceof Bar)​;

Bar()如您所见,返回一个函数。现在,Bar() instanceof Bar返回 false,这不是我想要的。如何检查 anew Bar()是否是 的实例Bar?这甚至可能吗?

4

2 回答 2

3

从构造函数返回任何对象都将使用该对象,而不是返回由构造函数自动生成的实例。这有点抽象,所以这里有一个例子来说明我的观点:

function Foo() {}
function Bar() {
    return new Foo();
}
f = new Foo();
console.log(f instanceof Foo); //true
b = new Bar();
console.log(b instanceof Bar); //false
console.log(b instanceof Foo); //true

JavaScript 中的一切都是对象,包括函数,因此foo.bar函数返回函数的事实意味着,当您调用时,new foo.bar()您将收到由返回的函数foo.bar而不是新foo.bar实例。


虽然我不能 100% 确定您正在尝试做什么,但您可以instanceof通过在上下文中使用来检查一个函数是作为对象初始化程序调用还是作为函数调用。这种模式通常用于强制对象初始化:

function Foo(...arguments...) {
    if (!(this instanceof Foo)) {
        return new Foo(...arguments...);
    }
    //do stuff
}

这允许Foo作为函数调用并仍然返回一个新Foo实例:

a = new Foo(); //a instanceof Foo
b = Foo(); //b instanceof Foo
于 2012-05-10T15:20:27.540 回答
0

不完全确定你为什么要做你正在做的事情,但我明白问题出在哪里。

在“测试”的范围内,this.bar 是函数 bar(prop),而不是作为执行此函数的结果返回的函数,如果这有意义的话。然而, new this.bar('hi') 将首先执行 bar('hi'),它返回一个匿名函数,然后充当构造函数。

换句话说,您正在比较从匿名函数创建的实例与不同的函数,因此 instanceof 正确返回 false。

以下日志为“真实”,但可能不是您要查找的内容:

function foo() {
    this.test = function() {
        var cls = this.bar('hi');
        console.log(new cls() instanceof cls);
    };

    this.bar = function bar(prop) {
        this.prop = prop;
        var that = this;
        return function() {
            this.prop = that.prop;
        }
    }
}

var test = new foo();
test.test();
于 2012-05-10T15:21:38.447 回答