假设我从我的服务器接收到一些 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"
我基本上想要在这里做的是向对象的原型(prototype)添加一个方法。 fullName()
方法是通用的,因此不应添加到数据对象本身。喜欢..:
personData.fullName = function() { return this.firstName + " " + this.lastName; }
... 会造成大量冗余;并且可以说“污染”数据对象。
将此类方法添加到简单数据对象的当前最佳实践方法是什么?
编辑:
有点跑题了,但是如果上面的问题可以解决,就可以像这样做一些不错的伪模式匹配
:
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");
}
如果 data
对象具有正确的属性,Person
和 Dog
将添加方法。如果不是,则返回 falsy(即数据确实不匹配/符合)。
奖励问题:有没有人知道使用或启用此功能(即使其变得容易)的库?它已经是javascript模式了吗?如果是这样,它叫什么;你有详细说明的链接吗?谢谢:)
最佳答案
假设您的对象来自某个解析服务器输出以生成对象的 JSON 库,那么它的原型(prototype)通常不会有任何特别之处;并且为不同的服务器响应生成的两个对象不会共享原型(prototype)链(当然,除了 Object.prototype ;))
如果您控制从 JSON 创建“Person”的所有位置,则可以反过来做:创建一个“空”Person 对象(在其原型(prototype)中使用类似 fullName 的方法),并使用从 JSON 生成的对象(使用 $.extend、_.extend 或类似的东西)。
var p = { first : "John", last : "Doe"};
function Person(data) {
_.extend(this, data);
}
Person.prototype.fullName = function() {
return this.first + " " + this.last;
}
console.debug(new Person(p).fullName());
关于javascript - 如何向(JSON)对象的原型(prototype)添加方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054678/