我发布此内容是希望有人能够处理类似的问题。
我正在使用封装参数的 JavaScript 对象来初始化代码中的更大对象,如下所示:
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"}
}
}
并尝试将设置与 this.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;
}
但这仍然没有达到标准。 我正在争论的另一个问题是原始的“设置”是否应该保留其自己的初始属性,或者只保留原型(prototype)中的任何内容。此外,要求原型(prototype)本身了解设置可能包含的每个可能值是毫无意义的,尤其是对于深层嵌套对象。
所以我的问题是,您是否知道解决此问题的任何正确方法并最终得到一个设置对象,该对象在缺少参数的情况下可以从原型(prototype)中获取默认值,但也不会丢失其自己的值需要以某种方式保留吗?
非常感谢
最佳答案
我建议使用 jQuery,然后利用 $.extend() 函数,如 jQuery plugins page 中所述。 。基本上,您将默认参数定义为构造函数方法中的对象,然后使用 $.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'});
您可以看到实际演示 here .
关于javascript - 在 JavaScript 中管理对象构造参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9859734/