用javascript管理对象构造参数
managing object construction parameters in javascript
我发布这篇文章是希望有人能处理类似的问题。
我正在使用一个封装参数的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"}
}
}
并尝试将设置与此进行比较。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;
}
然而,这仍然达不到标准。我正在讨论的另一个问题是,原始的"设置"是否应该保留其自己的任何初始属性,或者只保留原型中的任何属性。此外,要求原型本身了解设置可能包含的每一个可能值也是毫无意义的,尤其是对于深度嵌套对象。
所以我的问题是,你知道有什么合适的方法来解决这个问题,并最终得到一个设置对象,在它的参数缺失的地方,可以从原型中获得默认值,但也不会在需要保存的地方丢失它自己的值吗?
非常感谢
我建议使用jQuery,然后利用$.extend()函数,如jQuery插件页面上所述。基本上,您将默认参数定义为构造函数方法中的一个对象,然后使用$.extend()只覆盖函数参数中提供的属性。
所以你可能会得到这样的东西:
var MyObject = function (options) {
this.defaultOptions = {
stringParameter: "string default value",
objParameter: {}
};
this.options = $.extend(true, this.defaultOptions, options);
};
使用默认参数实例化:
var obj1 = new MyObject({});
使用重写字符串实例化参数:
var obj2 = new MyObject({stringParameter: 'overridden value'});
你可以在这里看到这方面的演示。
相关文章:
- 我们可以用参数对象集合而不是原始数据来调用JavaScript collection.reduce()方法吗
- 如何将参数对象传输到函数
- 为什么参数对象没有在控制台中显示它的方法
- JavaScript参数对象不起作用
- 如何在 JavaScript 中取消移位或添加到参数对象的开头
- 使用参数对象而不是参数
- JavaScript 参数对象 MDN 指南
- 如何获取参数对象的子集?(关于具有可变大小的参数)
- 如何更好地检查 javascript 中的参数对象
- 如何使用 ajax 调用带有参数(对象)的服务器端方法,其中 url 具有查询参数
- 如何在 ie8 中检测参数对象
- 手动将 AngularJS $http参数对象转换为 URL 参数
- JavaScript 参数对象引用未知
- Javascript - 对 2 参数对象的数组进行排序
- 为什么下划线说 _.initial 对参数对象特别有用
- 未命名的传递参数不包含在“参数”对象中
- JavaScript:获取回调的参数对象
- Javascript参数对象
- 围绕JavaScript参数对象使用的Sonar违规
- each()在IE8上不起作用,并给了我一个“;期望应用数组或参数对象”;.如何解决