解决方案
我仍然掌握着它的窍门,对你们很多人来说,这可能是合乎逻辑的。但我已经更新了我的帖子,也许有人会通过搜索来这里。
声明:
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
但谢谢你的例子:)