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却是空


4 回复

为了实现您所描述的需求,即在实例化对象时动态地传入配置参数,并且这些配置参数能够覆盖默认值,我们需要确保在初始化过程中正确地将传入的参数赋值给相应的属性。以下是改进后的代码示例:

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); // 打印配置

解释

  1. Common对象:定义了默认数据data和配置对象confinit方法用于接收传入的配置参数并更新conf
  2. Some构造函数:继承自Common对象,并调用init方法以初始化配置。
  3. 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--------");

解释

  1. 初始化配置:在 Commoninit 方法中将传入的 param 赋值给 conf
  2. 构造函数继承:在 Some 构造函数中使用 Common.init.call(this, param) 确保 init 方法中的 this 指向当前实例。
  3. 原型继承:使用 Object.create 创建 Some.prototype,确保 Some 的实例可以访问到 Common 的方法。

这样,在 Factory 中创建 Some 实例时,配置参数会正确地传递并存储在 conf 中,使得 a.say()a.conf 都能正常工作。

回到顶部