Передача переменных с использованием композиции объекта в 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
метод, или как вы привыкли.