使用模块模式时如何创建对象的新实例?

How do I create a new instance of an object when using the module pattern?

我正在使用 Javascript 的 "module pattern" 创建一个新的 class。这是我拥有的:

var Car = (function() {
    var internal = {};

    internal.init = function(color, brand) {
        internal.color = color;
        internal.brand = brand;

        return internal;
    }

    return internal;
})(); 

但是,当我创建新实例时,似乎所有 return 都具有相同的数据:

var ferrari = Car.init('red', 'ferrari');
var audi = Car.init('blue', 'audi');

console.log(ferrari.color + ' ' + ferrari.brand); // --> "blue audi"
console.log(audi.color + ' ' + audi.brand);       // --> "blue audi"

我该如何修复它,使其 return 成为初始化时使用的数据?

您应该在 init 方法中实例化一个 class。
你应该在你的模块中创建一个 class 并在你的 init.

中实例化它

应该这样做:

var Car = (function() {
    var internal = {};

    var theClass = function(color, brand) {

        this.color = color;
        this.brand = brand;

    }

    internal.init = function(color, brand) {
       return new theClass(color, brand);
    }

    return internal;
})(); 

请参考:http://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript

您正在混合一些概念,以客观地解决您的问题:

var Car = (function() {
    var internal = {};

    internal.init = function(color, brand) {
        var car = {}
        car.color = color;
        car.brand = brand;

        return car;
    }

    return internal;
})();

你做了这样的事情:

  1. 创建了一个匿名函数并执行了它。执行做了:
  2. 创建一个对象并分配给一个名为internal的变量。
  3. 那个单个实例 上创建一个函数以再次更改 自身 和 return 自身.
  4. Return即单实例.

如你所见,两次调用init只是改变同一个对象,而不是创建一个新对象。

您必须每次创建一个新实例才能实现您的期望。无论如何,请阅读 new 运算符和 prototypes 以更好地理解该主题。