Передача переменных с использованием композиции объекта в JavaScript - PullRequest
0 голосов
/ 12 октября 2018

Я некоторое время пытался обернуть голову вокруг Композиции объектов, и я не могу найти "правильный способ" сделать то же самое, что делал раньше с ООП.Допустим, у меня есть класс Entity с 3 переменными, с ООП я просто создал бы класс Entity, и у всех потомков этого класса были бы эти 3 свойства, но, используя композицию объектов, я не могу понять, как я долженподражайте этому наследованию.

const Entity = {
    let self = {
         x: 0,
         y: 0,
         z: 0,
}

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

const ObjectX = {
     let state = {
        x: 0,
        y: 0,
        z: 0,
        abc: 0,
        cba: 0,
return Object.assign(state, canDoX);
}

const ObjectY = {
     let state = {
        x: 0,
        y: 0,
        z: 0,
        foo: 0,
        bar: 0,
return Object.assign(state, canDoY);
}

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Вы, вероятно, хотите конструктор?

function BatLoser(batterName){
  this.batter = batterName; this.balls = 0; this.strikes = 0; this.onBase = false; this.strikeOut = false;
  this.swing = function(){
    var zeroOneTwo = Math.floor(Math.random()*3);
    switch(zeroOneTwo){
      case 0:
        this.balls++;
        console.log('ball '+this.balls+' for '+this.batter);
        break;
      case 1:
        this.strikes++;
        console.log('strike '+this.strikes+' for '+this.batter);
        break;
      case 2:
        this.onBase = true;
        console.log(this.batter+' hits the ball and is on base');
        return this;
    }
    if(this.balls > 3){
      this.onBase = true;
      console.log(this.batter+' walks on base');
    }
    if(this.strikes > 2){
      this.strikeOut = true;
      console.log(this.batter+' struck out');
    }
    return this;
  }
  this.batterUp = function(){
    while(!this.onBase && !this.strikeOut){
      this.swing();
    }
    return this;
  }
}
var bob = new BatLoser('Bob'), joe = new BatLoser('Joe');
bob.batterUp(); console.log('-------'); joe.batterUp();

Просто продолжайте нажимать эту кнопку, чтобы увидеть, как меняются результаты.

Обратите внимание, что каждый экземпляр конструктора new создает объект new.У объектных литералов нет метода __constructor или того, к чему вы привыкли.

0 голосов
/ 12 октября 2018

Если вы хотите расширить (через прототип) некоторый объект другим объектом, то вы можете использовать метод Object.create, который принимает объект в качестве аргумента и создает новый объект с этим переданным в объекте, связанном с ним через цепочку прототипов.

const entity = {
    x: 1,
    y: 2,
    z: 3
};

const objectX = Object.create(entity);
objectX.abc = 'something';

console.log(objectX.x);
console.log(objectX.y);
console.log(objectX.z);
console.log(objectX.abc);

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

const entity = {
    x: 1,
    y: 2,
    z: 3
};

const objectX = Object.assign({}, entity);
objectX.abc = 'something';

console.log(objectX.x);
console.log(objectX.y);
console.log(objectX.z);
console.log(objectX.abc);

Последняя вещь, Object.assign может быть заменена разрушением объекта, подобным этому.

const objectX = { ...entity };

Но опять же, это также производит только поверхностную копию.

...