我正在编写一个广泛使用特定形式数据集的javascript应用程序,例如
{ foo: 'foo', bar: 'bar', quz: { baz : 'baz' }}
它只是数据,但是它是嵌套的。没有静态数据。
我想为该数据集创建一个模板以保持代码清洁。我可以将模板对象放在某处并且每次都克隆它,就像(仅使用jquery作为示例)
var ds = jQuery.extend(true, {}, config.dataset);
或者我可以创建一个' Class'或者我可以用
调用的函数原型var ds = new Dataset();
什么表现最好?如果使用new
构造函数,那么Class和函数定义之间是否存在差异?
答案 0 :(得分:0)
有几种方法可以做到这一点,不仅你指定的两个,你也可以使用纯JS原型,当比较所有三个时,似乎纯js将是最快的。
少数事情:
JSON.parse(JSON.stringify(firstValueObject));
答案 1 :(得分:0)
一般情况下,“什么表现最佳?”的答案是:担心如果<何时您确实遇到了性能问题。
“什么表现最好?”的答案在JavaScript中是:
参见一般答案,
依赖于测试目标JavaScript引擎(浏览器等)
让我们忽略表现,看看你给出的替代方案。
实现DataSet
“类”(构造函数和相关原型,使用新的或旧的语法)将非常复杂,并且对于您描述的用例几乎没有任何好处。您有一个嵌套的对象结构:
{ foo: 'foo', bar: 'bar', quz: { baz : 'baz' }}
...所以如果你把它作为原型,那么非常很容易在实例之间进行串扰。例如:
// Demonstrating cross-talk
function DataSet() {
}
DataSet.prototype = { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }};
var d1 = new DataSet();
var d2 = new DataSet();
d1.quz.baz = "updated";
document.body.innerHTML = d2.quz.baz; // "updated" - huh?!
为避免这种情况,您必须在构建时复制quz
属性:
function DataSet() {
this.quz = jQuery.extend(true, {}, this.quz);
}
然后,您必须记住在原型中添加新的嵌套对象时这样做。
根据您所说的,最简单的解决方案就是将您的第一个示例与jQuery.extend
一起使用。
答案 2 :(得分:0)
受到TJCrowder在这里的回答的启发,我想出了第三个选项
function newDataset( return { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }});
var ds = newDataset();