我正在使用构造函数模式来创建我的对象,如下所示;
// Traditional constructor function
const Car = function( color, speed, oil )
{
this.color = color;
this.config = { speed: speed, oil: oil };
// ...
}
Car.prototype.internal = function()
{
console.log( "internal" );
// ...
}
Car.prototype.gas = function()
{
this.internal();
console.log( this.color );
// ...
}
Car.prototype.brake = function()
{
console.log( this.config );
// ...
}
我想将我的设计改为相当于这种设计但具有工厂功能。所以我写了下面的代码;
// Factory Design with Delegation
const carProto = ( function()
{
const carPrototype = {};
// Private function
function internal()
{
console.log( "internal" );
// ...
}
// Public function
carPrototype.gas = function()
{
internal();
console.log( this.color );
// ...
}
carPrototype.brake = function()
{
console.log( this.config );
// ...
}
return carPrototype;
} )();
function carFactory( color, speed, oil )
{
return Object.assign( Object.create( carProto ),
{
color: color,
config: { speed: speed, oil: oil }
} );
}
最后,我创建我的对象如下;
var mazdaF = carFactory( "red", 10, 130 );
var mazdaT = new Car( "yellow", 20, 120 );
我想知道这是否正确。如果不是这样,有人可以用最好的方式帮助我实现吗?
这似乎对我有用。这与我使用的语法不同。行为的一个关键差异是您的工厂允许我查看内部范围。我可以使用mazdaF.color
或mazdaF.config
访问颜色和配置。如果你希望它以这种方式工作,那很好。但是,如果您希望内部作用域是对象的私有,则可以使用不同的语法。
这是另一种方式(我不确定这是普遍的标准做法,所以我希望其他人会参与......):
const carFactory2=(c,s,o)=>{
const color=c;
const config={'speed':s, 'oil':o};
const internal=()=>{
console.log('internal');
}
return{
gas: ()=>{
internal();
return color;
},
brake: ()=>{
internal();
}
}
}
var mazdaF = carFactory2( "red", 10, 130 );
这种方式实际上使一个对象保留了函数的内部范围。 color
,config
和internal()
在函数外部不可访问,因此无法在下游更改,除非您为其添加方法。在这里,mazdaF.gas()
将返回颜色并执行内部方法。 ...但是config
不能通过用mazdaF.brake()
调用mazdaF.config = ...
或暴力来改变。
我希望我不会引起混乱。同样,我认为您的选择将取决于您希望如何使用内部范围。