在javascript中管理对象构造参数
我发布这篇文章是希望有人能处理类似的问题 我使用一个封装参数的javascript对象来初始化代码中更大的对象,如下所示:在javascript中管理对象构造参数,javascript,Javascript,我发布这篇文章是希望有人能处理类似的问题 我使用一个封装参数的javascript对象来初始化代码中更大的对象,如下所示: function MyObject(setup) { this.mysetup = setup; if(typeof this.mysetup == "undefined") { this.mysetup = {} } if(typeof this.mysetup.stringParameter == "undefined") {
function MyObject(setup)
{
this.mysetup = setup;
if(typeof this.mysetup == "undefined") { this.mysetup = {} }
if(typeof this.mysetup.stringParameter == "undefined")
{
this.mysetup.stringParameter="string default value"
}
if(typeof this.mysetup.objParameter == "undefined")
{
this.mysetup.objParameter == {}
}
else
{
if(typeof this.mysetup.objParameter.member1 == "undefined")
{
this.mysetup.objParameter.member1 = "member1 default value"
}
}
// ...and so on
}
通过这种方式,我可以确保不是每个参数都需要在设置中,而且MyObject仍然可以对缺少的参数使用默认值
然而,这是一个乏味的东西写和相当容易出错。因此,我想尝试一种解决方案,对照setupPrototype检查设置:
function MyObject(setup)
{
this.setupPrototype = {
stringParameter : "string default value",
objectParameter : { member1 : "member default value"}
}
}
并尝试将设置与此进行比较。setupPrototype。
我为此而准备的函数如下所示
parseSetup = function (obj, objPrototype)
{
var returnedObj = {};
var hasMembers = false;
if(typeof obj=="undefined")
{
returnedObj = objPrototype;
return returnedObj;
}
for(member in objPrototype)
{
hasMembers = true;
//if prototype member is not part of initialization object
if (typeof obj[member]=="undefined")
{
returnedObj[member] = objPrototype[member];
}
else
{
if(objPrototype[member] instanceof Object)
{
if(objPrototype[member] instanceof Array)
{
returnedObj[member]=[];
for(var i=0; i<objPrototype[member].length; i++)
{
returnedObj[member].push(parseSetup(obj[member][i], objPrototype[member][i]))
}
}
else{
returnedObj[member] = parseSetup(obj[member], objPrototype[member])
}
}
else
returnedObj[member] = obj[member];
}
}
if(!hasMembers)
{
if (typeof obj == "undefined")
{
returnedObj = objPrototype;
}
else
returnedObj = obj;
}
return returnedObj;
}
parseSetup=function(obj,objPrototype)
{
var returnedObj={};
var hasMembers=false;
如果(对象类型==“未定义”)
{
returnedObj=objPrototype;
returnedObj;
}
for(objPrototype中的成员)
{
hasMembers=true;
//如果原型成员不是初始化对象的一部分
if(对象类型[成员]=“未定义”)
{
returnedObj[member]=objPrototype[member];
}
其他的
{
if(对象的objPrototype[member]实例)
{
if(objPrototype[member]instanceof数组)
{
returnedObj[成员]=[];
对于(var i=0;i,我建议使用jQuery,然后利用$.extend()函数,如上所述。基本上,您可以将默认参数定义为构造函数方法中的对象,然后使用$.extend()只覆盖参数中提供给函数的属性
所以你可能会得到这样的结果:
var MyObject = function (options) {
this.defaultOptions = {
stringParameter: "string default value",
objParameter: {}
};
this.options = $.extend(true, this.defaultOptions, options);
};
要使用默认参数进行实例化,请执行以下操作:
var obj1 = new MyObject({});
要使用重写的stringParameter进行实例化,请执行以下操作:
var obj2 = new MyObject({stringParameter: 'overridden value'});
您可以看到这项工作的演示。谢谢您的回答,似乎能够完成这项工作。