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的子函数