Javascript 从对象返回函数会中断instanceof

Javascript 从对象返回函数会中断instanceof,javascript,oop,Javascript,Oop,这个小宝石让我有点头疼。假设我创建了一个返回函数的对象,如下所示: 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()instanc

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

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,这不是我想要的。如何检查
新条形图()
是否为
条形图的实例?这可能吗?

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

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

不完全确定你为什么想做你正在做的事情,但我知道问题是什么

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

换句话说,您正在将匿名函数创建的实例与其他函数进行比较,以便instanceof正确返回false

以下日志为“true”,但可能不是您要查找的日志:

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();

我甚至不确定我是否明白你想做什么
new foo.bar()
永远不会是foo的
instanceof
,它是foo.bar的
instanceof
“instanceof操作符测试对象在其原型链中是否具有构造函数的原型属性。”()。我不明白为什么您希望bar()是foo.bar的实例。另外,从构造函数返回对象将使用返回的对象,而不是实例化该类型的新对象。我对您的变量名有点困惑。你是说
newtest.bar()
还是
(new foo.bar()
?或者
new foo.bar()
是什么意思
foo
没有属性
bar
。在任何情况下,由于
bar()
返回函数,因此它永远不是
test.bar
的实例。。。您要解决的总体问题是什么?这是不可能的,因为您只是不返回
Bar
的实例。您返回一个新函数。。。如果您可以创建一个从
Bar
继承的函数,那么它就可以工作了,但是这是不可能的(但是,谁知道将来的ES版本会出现什么)。这仍然很有用,howard10。我想这实际上可以解决我的问题。