在 javascript 中使用对象组合传递变量
Passing variables using object composition in javascript
一段时间以来,我一直在努力研究对象组合,但似乎找不到 "correct way" 来做我之前使用 OOP 所做的事情。假设我有一个带有 3 个变量的 class 实体,使用 OOP 我只会创建一个 class 实体并且这个 class 的所有子实体都将具有这 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);
}
如果你想用另一个对象扩展(通过原型)某个对象,那么你可以使用 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
方法,或者你习惯的任何方法。
一段时间以来,我一直在努力研究对象组合,但似乎找不到 "correct way" 来做我之前使用 OOP 所做的事情。假设我有一个带有 3 个变量的 class 实体,使用 OOP 我只会创建一个 class 实体并且这个 class 的所有子实体都将具有这 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);
}
如果你想用另一个对象扩展(通过原型)某个对象,那么你可以使用 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
方法,或者你习惯的任何方法。