Передача переменных с использованием композиции объекта в JavaScript

Я некоторое время пытался обернуть голову вокруг Композиции объектов, и я не могу найти "правильный способ" сделать то же самое, что делал раньше с ООП. Допустим, у меня есть класс 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 ответа

Решение

Если вы хотите расширить (через прототип) некоторый объект другим объектом, вы можете использовать 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 };

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

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

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 метод, или как вы привыкли.

Другие вопросы по тегам