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

时间:2015-02-06 01:38:49

标签: javascript oop design-patterns

我正在使用Javascript"模块模式"创建一个新类。这就是我所拥有的:

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

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

        return internal;
    }

    return internal;
})(); 

但是,当我创建新实例时,它似乎都返回相同的数据:

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"

如何修复它以便返回用初始化的数据?

2 个答案:

答案 0 :(得分:1)

您应该在init方法中实例化一个班级 您应该在模块中创建一个类,并在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

答案 1 :(得分:0)

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

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. 该单个实例上创建一个功能,以更改本身并再次返回本身
  4. 返回单个实例
  5. 如您所见,调用init两次只会更改同一个对象,而不是创建一个新对象。

    每次都必须创建一个新实例才能实现您的期望。无论如何,请阅读有关运算符和原型的内容,以便更好地了解该主题。