我见过许多 javascript 对象都有一个“init”方法,您可以将值传递给该方法以设置对象。
当传入名称/值对数组时,它们如何在内部处理其私有变量的初始化,例如:
myObject.init( {prop1: "blah", prop2: "asdf", ..., propn: "n"} );
具体来说,其中一些值可以是可选的,因此如果在初始化期间传入了名称/值对,您将如何设置默认值然后覆盖它们。
我见过许多 javascript 对象都有一个“init”方法,您可以将值传递给该方法以设置对象。
当传入名称/值对数组时,它们如何在内部处理其私有变量的初始化,例如:
myObject.init( {prop1: "blah", prop2: "asdf", ..., propn: "n"} );
具体来说,其中一些值可以是可选的,因此如果在初始化期间传入了名称/值对,您将如何设置默认值然后覆盖它们。
var myObject = {
init: function(options) {
this.foo = options.foo || 'some default';
this.bar = options.requiredArg;
if (!this.bar) raiseSomeError();
}
}
这在 FF5、IE8、Chrome 12、Opera v11.5 上测试正常。默认值是什么并不重要,如果它们的键在调用列表中,它们将被覆盖,否则它们将被单独留下。
var myObject = {
prop1: 'default1',
prop2: 'default2',
prop3: 'default3',
prop4: 'default4',
prop5: 'default5',
prop6: 'default6',
init: function(options) {
for(key in options) {
if(this.hasOwnProperty(key)) {
this[key] = options[key]
}
}
}
}
myObject.init( {prop1: "blah", prop2: "asdf", prop5: "n"} )
我能想到的最简洁的方法是使用包含所有默认属性的默认对象,如下所示:
function init( args ) {
this.value = 'value' in args ? args.value : defaults.value;
}
您甚至可以使用 for 循环遍历默认对象,这样您就不必跟踪您希望对象包含哪些属性。
您应该使用“in”运算符,因为实际上可以将属性的值设置为未定义。将属性设置为未定义是有效的,在这种情况下,它实际上被视为已设置,确保未设置值的唯一方法是检查它是否根本不在对象中。
更好的是,从对象中获取 init 方法,以便您可以将 init 用于其他对象。
这在 FF5、IE8、Chrome 12、Opera v11.5 上测试正常。默认值是什么并不重要,如果它们的键在调用列表中,它们将被覆盖,否则它们将被单独留下。
var myGlobal = {
init: function(obj, options) {
for(key in options) {
if(obj.hasOwnProperty(key)) {
obj[key] = options[key]
}
}
}
}
var myObject = {
prop1: 'default1',
prop2: 'default2',
prop3: 'default3',
prop4: 'default4',
prop5: 'default5',
prop6: 'default6'
}
myGlobal.init( myObject, {prop1: "blah", prop2: "asdf", prop5: "n"} )
哦让我们看看
编辑:更新,这确实有效
function myObject(){}
myObject.prototype.init = function (argObj)
{
if (!argObj)
{
argObj = new Object();
}
var abc = (argObj['abc'] != undefined) ? argObj['abc'] : "default value 1";
var defg = (argObj['defg'] != undefined) ? argObj['defg'] : "default value 2";
}
您可以使用三元运算符来检查是否设置了初始化数组的元素,如果设置则使用它,否则使用默认值。例如,假设初始化数据作为一个名为init
...的对象传递。
var myObject = {
init: function(opts) {
this.foo=(typeof(opts.foo)!="undefined")?opts.foo:'default value';
}
}
或者,您可以只复制初始化数组,覆盖先前设置的值
var myObject = {
init: function(opts) {
this.foo='default value';
for (name in opts)
{
this[name]=opts[name];
}
}
请注意,像这样的成语
this.foo = opts.foo || 'some default';
如果 opts.foo 设置为评估为 false 的值,例如 0,则失败