Заводской шаблон Эквивалент шаблона конструктора - PullRequest
0 голосов
/ 19 сентября 2018

Я использую шаблон конструктора для создания своих объектов, как показано ниже;

// Traditional constructor function
const Car = function( color, speed, oil )
{
    this.color = color;
    this.config = { speed: speed, oil: oil };
    // ...
}

Car.prototype.internal = function()
{
    console.log( "internal" );
    // ...
}

Car.prototype.gas = function()
{
    this.internal();
    console.log( this.color );
    // ...
}

Car.prototype.brake = function()
{
    console.log( this.config );
    // ...
}

И я хочу изменить свой дизайн на эквивалент этого дизайна, но с заводскими функциями.Поэтому я написал следующий код:

// Factory Design with Delegation
const carProto = ( function()
{
    const carPrototype = {};
    // Private function
    function internal()
    {
        console.log( "internal" );
        // ...
    }

    // Public function
    carPrototype.gas = function()
    {
        internal();
        console.log( this.color );
        // ...
    }

    carPrototype.brake = function()
    {
        console.log( this.config );
        // ...
    }

    return carPrototype;
} )();

function carFactory( color, speed, oil ) 
{
    return Object.assign( Object.create( carProto ), 
    { 
        color: color,
        config: { speed: speed, oil: oil } 
    } );
}

Наконец, я создаю свои объекты следующим образом:

var mazdaF = carFactory( "red", 10, 130 );
var mazdaT = new Car( "yellow", 20, 120 );

Я хочу знать, правильно ли это или нет.Если это не так, кто-нибудь может мне помочь с наилучшим способом реализации этого?

1 Ответ

0 голосов
/ 19 сентября 2018

Мне кажется, это хорошо работает.Это другой синтаксис, чем я бы использовал.Ключевое различие в поведении состоит в том, что ваша фабрика позволяет мне видеть внутреннюю сферу.Я могу получить доступ к цвету и конфигурации с mazdaF.color или mazdaF.config.Если вы хотите, чтобы это работало таким образом, это нормально.Но если вы хотите, чтобы внутренняя область была приватной для объекта, вы должны использовать другой синтаксис.

Вот еще один способ (я не уверен, что это универсальная стандартная практика, поэтому я надеюсь, что кто-то еще будет вмешиваться ...):

const carFactory2=(c,s,o)=>{
    const color=c;
    const config={'speed':s, 'oil':o};
    const internal=()=>{
        console.log('internal');
    }
    return{
        gas: ()=>{
            internal();
            return color;
        },
        brake: ()=>{
            internal();
        }
    }
}

var mazdaF = carFactory2( "red", 10, 130 );

Этот способ фактически делает объект, которыйсохраняет внутреннюю область действия функции.color, config и internal() недоступны вне функции и, следовательно, не могут быть изменены в нисходящем направлении, если вы не добавите для этого метод.Здесь mazdaF.gas() вернет цвет и выполнит внутренний метод.... Но config также нельзя изменить, вызвав mazdaF.brake() ИЛИ грубая сила с mazdaF.config = ....

Надеюсь, я не вызываю замешательства.Опять же, я думаю, что ваш выбор будет зависеть от того, как вы хотите использовать внутреннюю область.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...