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。我想这实际上可以解决我的问题。