instanceof,范围和对象

smo*_*ody 3 javascript scope instanceof

有人可以向我解释这种行为吗?

'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"
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么foo对象不是我在fooFactory中声明的foo构造函数的实例.

Aad*_*hah 5

你明确地从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;
        };
    };
}
Run Code Online (Sandbox Code Playgroud)

我这样写它的原因如下:

  1. 不应调用工厂函数new.只应调用构造函数new.此外,即使您fooFactory使用new它进行调用也绝对没有区别,因为您无论如何都明确地返回了对象文字.实际上它会慢一些.
  2. 而不是使用构造函数返回一个对象而另一个实例化构造函数的函数不是更好的简单地返回新创建的构造函数本身?由于你的工厂被命名,fooFactory我会假设它返回foo而不是具有foo属性的对象.
  3. 如果您要创建一个函数并将其用作构造函数,则不要显式返回它的对象.当您使用newJavaScript 调用函数时,会自动创建该函数的新实例prototype并将其绑定到this函数内部.只要您没有从构造函数显式返回一个对象,this就会自动返回该函数.

希望有所帮助.