Выберите, какой набор методов имеет объект, основываясь на аргументе при создании объекта - JavaScript - PullRequest
2 голосов
/ 05 января 2012

Я искал и читал в течение нескольких часов, но до сих пор не могу понять базовый шаблон проектирования для создания нового объекта, который имеет выбор различных методов (с тем же именем), который устанавливается в зависимости от одного из аргументов. Вот некоторый код, чтобы объяснить, что я пытаюсь сделать. Все советы и альтернативные подходы приветствуются. Я надеюсь, что кто-то сможет освободить меня от этого облака невежества. Спасибо

function BaseConstructor(whichMethods) {
    if (whichMethods==='a') {
         // do something to incorporate methodSetA
    }
    else if (whichMethods==='b') {
        // do something to incorporate methodSetB
    }

    this.init();
};

var methodSetA = {
    init: function() {
        // do initialisation A way
    },
    speak: function() {
        alert('i speak AAA way')
    }
};

var methodSetB = {
    init: function() {
        // do initialisation B way
    },
    speak: function(){
        alert('i got BBB all the way')
    }
};

thing = new BaseConstructor('b'); 
// b is an instance of BaseConstructor and has done the bWay init() function

thing.speak() // return alert 'i got BBB all the way'

Ответы [ 3 ]

0 голосов
/ 05 января 2012

Вы можете сделать это, используя фабричную функцию (обычная функция, которая создает подходящий для вас объект):

function BaseConstructor(whichMethods) {
    var elem;
    if (whichMethods==='a') {
         elem = new MethodSetA();
    } else if (whichMethods==='b') {
         elem = new MethodSetB();
    } else {
         // figure out what to do here if whichMethods is neither of the previous options
    }

    elem.init();
    return(elem);
};

И вызвать его как обычный вызов функции:

var thing = BaseConstructor('b');
thing.speak();

Примечание: new не используется BaseConstructor(), поскольку это обычный вызов функции.

0 голосов
/ 05 января 2012

Вы ищете фабричный образец.Пример:

    function objectFactory(whichMethods) {
        if (whichMethods==='a') {
            return new objectSetA();
        }
        else if (whichMethods==='b') {
            return new objectSetB()
        }
    };
    function objectSetA() {
        this.init = function() {
        // do initialisation A way
        },
        this.speak = function() {
            alert('i speak AAA way')
        }
    };

    function objectSetB() {
        this.init = function() {
        // do initialisation B way
        },
        this.speak = function(){
            alert('i got BBB all the way')
        }
    };
    var thing = objectFactory('b'); 
    thing.speak();
0 голосов
/ 05 января 2012

Что ж, чтобы сделать это по-своему, используя «наборы методов», вы можете выполнить итерацию и скопировать в this ( вот демо ):

function copy(source, destination) {
    for(var x in source) {
        if(source.hasOwnProperty(x)) {
            destination[x] = source[x];
        }
    }
}

function BaseConstructor(whichMethods) {
    if(whichMethods === 'a') {
        copy(methodSetA, this);
    } else if(whichMethods === 'b') {
        copy(methodSetB, this);
    }

    this.init();
}

Лично я предпочел бы присвоить непосредственно this.

...