【发布时间】:2013-02-24 17:55:48
【问题描述】:
假设我从我的服务器接收到一些 JSON 对象,例如Person 对象的一些数据:
{firstName: "Bjarne", lastName: "Fisk"}
现在,我想要一些基于这些数据的方法,例如用于计算全名:
fullName: function() { return this.firstName + " " + this.lastName; }
这样我就可以
var personData = {firstName: "Bjarne", lastName: "Fisk"};
var person = PROFIT(personData);
person.fullName(); // => "Bjarne Fisk"
我基本上想要在这里做的是向对象的原型添加一个方法。 fullName() 方法是通用的,因此不应添加到数据对象本身。喜欢..:
personData.fullName = function() { return this.firstName + " " + this.lastName; }
... 会造成大量冗余;并且可以说“污染”数据对象。
将此类方法添加到简单数据对象的当前最佳实践方法是什么?
编辑:
有点跑题了,但是如果上面的问题能解决的话,就可以做一些不错的伪pattern matching 像这样:
if ( p = Person(data) ) {
console.log(p.fullName());
} else if ( d = Dog(data) ) {
console.log("I'm a dog lol. Hear me bark: "+d.bark());
} else {
throw new Exception("Shitty object");
}
Person 和 Dog 将添加方法,如果 data 对象具有正确的属性。如果不是,则返回 falsy(即数据确实不匹配/符合)。
奖励问题:有没有人知道使用或启用此功能(即使其变得容易)的库?它已经是javascript模式了吗?如果是这样,它叫什么;你有详细说明的链接吗?谢谢:)
【问题讨论】:
-
您在检索 JSON 数据时难道不应该知道它是什么类型的对象吗?当然可以创建一个基本的对象构造库来执行您的建议,似乎基于属性检测对象的类型并不是最好的方法..特别是因为不同的类型可以有同名的属性。为什么不直接使用
fromJSON方法或构造函数来忽略构造函数未定义的属性? -
@MattB :我可以想象 parseJson 函数,它采用字符串和路径/原型类映射在构造时将类分配给对象。这里的 path 可以是例如 JsonPath 表达式:goessner.net/articles/JsonPath
-
嗯,Javascript 数据绑定框架通常使用路径将对象属性绑定到 HTML 中的某些内容,但我不确定为什么需要使用它们来构造对象,因为大多数服务器端语言现在可以序列化为 JSON。
-
@MattB:考虑这个函数调用
parseJsonPlus(str, {"/*": Person} )。用简单的英语:从str解析json,并使用new Person()而不是new Object()构造数据根的每个子节点。换句话说:json + 路径/类声明 = “分类”和结构化数据。 -
啊,我明白了。不幸的是,我不知道有任何库可以做到这一点(当然可以编写一个)。我确实找到了这个:stackoverflow.com/a/12978933/560114
标签: javascript json prototype