如何在同一行中初始化对象和使用方法?(工厂家长)



解决方案

我仍然掌握着它的窍门,对你们很多人来说,这可能是合乎逻辑的。但我已经更新了我的帖子,也许有人会通过搜索来这里。

声明:

var test=Element({"id" : 1, "name" : "wrapper"}).
append(Element({"id" : 2, "name" : "elm A"}),
Element({"id" : 3, "name" : "elm b"})
);
alert(test.getInfo("name"));
alert(test.aArguments["children"][1].getInfo("name"));

"class":

var Element = function ($aPassArguments) {
aArguments: {
"id" : false,
"name" : false,
"type" : false,
"title" : false, 
"style" : false,
"action" : [],
"parent" : false,
"children" : []
};
for (var prop in this.aArguments)
if (prop in $aPassArguments) 
this.aArguments[prop] = $aPassArguments[prop];
return {
append: function () {
$argList = arguments;
for ($i = 0; $i < $argList.length; $i++)
if (typeof $argList[$i]=="string")
this.setChild(this.importDB($argList[$i],true));
else
this.setChild($argList[$i]);
},
setChild: function($oChild) {
this.aArguments["children"][this.aArguments["children"].length]=$oChild; 
}
};
};

旧帖子:

我不知道javascript中的新对象实例是引用而不是副本。现在我想要一个我自己的对象Element的副本。很有吸引力(谢谢@blurd)我希望它是一款工厂混合动力车:http://javascript.info/tutorial/factory-constructor-pattern

多亏了@blurd和我定义一些问题的帮助,我想出了一个解决方案,如下所示:

(但我对下面的用法声明不满意)


var Element = function (initialConfig) {
return {
aArguments: {
"id" : false,
"name" : false,
"type" : false,
"title" : false, 
"style" : false,
"action" : [],
"parent" : false,
"children" : [],
},

create:function ($aPassArguments) {
for (var prop in this.aArguments)
if (prop in $aPassArguments) 
this.aArguments[prop] = $aPassArguments[prop];
},
append: function () {
$argList = arguments;
for ($i = 0; $i < $argList.length; $i++)
if (typeof $argList[$i]=="string")
this.setChild(this.importDB($argList[$i],true));
else
this.setChild($argList[$i]);
},
setChild: function($oChild) {
this.aArguments["children"][this.aArguments["children"].length]=$oChild; 
}
};
};

用法

var test=Element();
test.create({"id" : 1, "name" : "wrapper"});
var test2=Element();
test2.create({"id" : 2, "name" : "elm A"});
var test3=Element();
test3.create({"id" : 3, "name" : "elm B"});
test.append(test2,test3);
alert(test.aArguments["name"]);
alert(test.aArguments["children"][0].aArguments["name"]);

现在我对用法很不满意,我希望它是一行,并使用构造函数。最终拥有这样的东西:

var test=Element({"id" : 3, "name" : "wrapper"})
.append(Element{"id" : 3, "name" : "elm A"}), 
Element({"id" : 3, "name" : "elm B"}) 
);

var test=new Element({"id" : 3, "name" : "wrapper"})
.append( new Element{"id" : 3, "name" : "elm A"}), 
new Element({"id" : 3, "name" : "elm B"}) 
);

但是当我在这个结构中使用元素对象时,这些方法似乎没有绑定到它

对于一个构造函数,@blurd给了我这个使用原型的例子

var Element = function (initialConfig) {
aArguments: {
"id" : false,
"name" : false,
"type" : false,
"title" : false, 
"style" : false,
"action" : [],
"parent" : false,
"children" : [],
},
};
Element.prototype = {
create:function ($aPassArguments) {
....

这是一个关于以下方面的后续问题:复制自己的对象而不是参考(更新后的帖子,不同的Q)

只需在Element上创建一个接受嵌套层次结构的工厂方法:

var test = Element.build(
{ id: 1, name: 'wrappper', children: [
{ id: 2, name: 'elem A' },
{ id: 3, name: 'elem B' }]
});

你只是把你想要隐藏的代码移动到一个函数中,这个函数把它隐藏在一个正常的接口后面。这是编程。

我不得不写这样的语句:

var test=Element().create({"id" : 1, "name" : "wrapper"}).
append(Element().create({"id" : 2, "name" : "elm A"}));

除了对象和inheritting是在包装器中构造的之外,@meaviar提供的建议并没有什么不同。而不是使用.append()。这将创建相同的IMO。也许它更快?保存方法?我也可能只是觉得一切都错了。。。对我来说已经过了就寝时间:P

但谢谢你的例子:)

最新更新