Javascript 实例、范围和对象
谁能向我解释一下这种行为吗Javascript 实例、范围和对象,javascript,scope,instanceof,Javascript,Scope,Instanceof,谁能向我解释一下这种行为吗 'use strict' var fooFactory = function() { function foo() { var name = "foo object"; function getName() { return name; } return { getName: getName } } func
'use strict'
var fooFactory = function() {
function foo() {
var name = "foo object";
function getName() {
return name;
}
return {
getName: getName
}
}
function getFoo() {
return new foo;
}
return {
getFoo: getFoo,
foo: foo
}
};
var factory = new fooFactory();
var bar = factory.getFoo();
console.log("is " + bar.getName() + " instance of foo: " + (bar instanceof factory.foo));
// outputs "is foo object instance of foo: false"
我不明白,为什么foo对象不是我在fooFactory中声明的foo构造函数的实例。您正在从
foo
函数显式返回一个对象。该对象不是foo
的实例。因此,bar
不是foo
的实例。以下是我将如何重写您的代码:
var foo = fooFactory();
var bar = new foo;
console.log("is " + bar.getName() + " instance of foo: " +
bar instanceof factory.foo);
function fooFactory() {
return function () {
var name = "foo object";
this.getName = function () {
return name;
};
};
}
我这样写的原因如下:
new
调用工厂函数。只能使用new
调用构造函数。此外,即使您确实使用new
调用foodfactory
,也不会有任何区别,因为您仍然显式返回一个对象文本。事实上,它会更慢fooFactory
,我假设它返回foo
,而不是具有foo
属性的对象new
JavaScript调用函数时,会自动创建该函数的prototype
的新实例,并将其绑定到函数内的this
。只要您没有从构造函数显式返回对象,这个
将自动返回希望能有所帮助。为了澄清Aadit的答案,问题是这行:
return {
getName: getName
}
删除它并将“getName”更改为“this.getName”,您的函数将按预期工作
var fooFactory = function() {
function foo() {
var name = "foo object";
// changed!
this.getName = function() {
return name;
}
// no return
}
function getFoo() {
return new foo;
}
return {
getFoo: getFoo,
foo: foo
}
};
var factory = new fooFactory();
var bar = factory.getFoo();
console.log("is " + bar.getName() + " instance of foo: " + (bar instanceof factory.foo));
// true!
删除函数foo()中的return语句 返回{ getName:getName }
new
运算符隐式返回函数foo的子实例
但您确实显式返回了object{getName:getName}
{getName:getName}不是函数foo的子函数