在JavaScript中使用对象组合传递变量

时间:2018-10-12 10:03:38

标签: javascript composition object-composition

一段时间以来,我一直在努力把自己的头放在对象组合上,而我似乎找不到“正确的方法”来完成我以前使用OOP所做的事情。可以说我有一个带有3个变量的类Entity,在OOP中,我将创建一个类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 :(得分:1)

如果要(通过原型)用另一个对象扩展某个对象,则可以使用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 };

但同样,这也只会产生浅表副本。

答案 1 :(得分:0)

您可能想要构造函数吗?

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方法,也没有您惯用的方法。