Nodejs:如果在new的时候动态地传入配置参数
Nodejs:如果在new的时候动态地传入配置参数
var Common={
data:100,
conf:{},
init:function(param){
this.conf=param;
},
say:function(){
console.log('say : '+ this.data+this.conf);
}
};
function Some(param){
this.init(param);
}
Some.prototype=Common;
function Factory(param){
return new Some(param);
}
var a =Factory({a:100,b:200});
a.say();
console.log("\n--------");
console.log(a.config);
想实现的是缺省值由Common提供 ,在Factory每次new的时候能够动态传入参数,但是 a.say执行有结果,但是打印 a.conf却是空
为了实现您所描述的需求,即在实例化对象时动态地传入配置参数,并且这些配置参数能够覆盖默认值,我们需要确保在初始化过程中正确地将传入的参数赋值给相应的属性。以下是改进后的代码示例:
var Common = {
data: 100,
conf: {},
init: function (param) {
// 覆盖默认配置
for (var key in param) {
if (param.hasOwnProperty(key)) {
this.conf[key] = param[key];
}
}
},
say: function () {
console.log('say : ' + this.data + JSON.stringify(this.conf));
}
};
function Some(param) {
this.init(param);
}
Some.prototype = Common;
function Factory(param) {
return new Some(param);
}
var a = Factory({ a: 100, b: 200 });
a.say();
console.log("\n--------");
console.log(a.conf); // 打印配置
解释
- Common对象:定义了默认数据
data
和配置对象conf
。init
方法用于接收传入的配置参数并更新conf
。 - Some构造函数:继承自
Common
对象,并调用init
方法以初始化配置。 - Factory工厂函数:用于创建
Some
实例,并传入配置参数。
在这个版本中,init
方法使用for...in
循环遍历传入的参数对象,并将其属性复制到conf
对象中。这样可以确保即使conf
对象在其他地方被修改,我们也可以在需要时重新初始化它。
当您运行这段代码时,a.say()
会输出带有配置信息的结果,同时console.log(a.conf)
也会显示正确的配置对象。
但是打印 a.conf却是空 console.log(a.config);
应该是 a.conf? console.log(a.conf);
原来是低级错误
从你的描述来看,问题在于 a.conf
是空的,而 a.say()
能正常工作。这可能是因为在构造函数中调用 init
方法时没有正确设置 conf
属性。以下是改进后的代码:
var Common = {
data: 100,
conf: {},
init: function (param) {
this.conf = param; // 将配置参数赋值给 conf
},
say: function () {
console.log('say : ' + this.data + JSON.stringify(this.conf)); // 打印 conf
}
};
function Some(param) {
Common.init.call(this, param); // 使用 call 来绑定 this
}
Some.prototype = Object.create(Common);
function Factory(param) {
return new Some(param);
}
var a = Factory({ a: 100, b: 200 });
a.say(); // 输出: say : 100{"a":100,"b":200}
console.log(a.conf); // 输出: { a: 100, b: 200 }
console.log("\n--------");
解释
- 初始化配置:在
Common
的init
方法中将传入的param
赋值给conf
。 - 构造函数继承:在
Some
构造函数中使用Common.init.call(this, param)
确保init
方法中的this
指向当前实例。 - 原型继承:使用
Object.create
创建Some.prototype
,确保Some
的实例可以访问到Common
的方法。
这样,在 Factory
中创建 Some
实例时,配置参数会正确地传递并存储在 conf
中,使得 a.say()
和 a.conf
都能正常工作。