我在一个博客上发现以下代码片段,以避免if-else语句。此代码非常模块化,可以轻松扩展。但是我无法使它正常工作。

CatModel.prototype.makeWords = function () {
    console.log('inside catmodel')
    this.setWord('meow')
    this.sayIt()
}

DogModel.prototype.makeWords = function () {
    console.log('inside dogmodel')
    this.setWord('bark')
    this.saySomething()
}


// somewhere else
var makeWords = function (type) {
    var model = namespace[type + 'Model']
    model.makeWords()
}

makeWords('cat')

最佳答案

假定CatModelDogModel函数在某处声明,并且setWordsayIt也在其prototype对象上设置。

您需要将CatModelDogModel放在一个对象中,并从namespace引用它(我建议不要调用namespace):

var namespace = {
    CatModel: CatModel,
    DogModel: DogModel
};


然后,在创建实例时,使用new(您始终将new与构造函数一起使用)。即使严格地说,如果您没有要传递的参数,它们也是可选的,但我也会在通话中加入()

var makeWords = function (type) {
    var model = new namespace[type + 'Model']()
    // ---------^^^--------------------------^^
    model.makeWords()
}

10-07 16:18