javascript - 如何向(JSON)对象的原型(prototype)添加方法?

标签 javascript json prototype

假设我从我的服务器接收到一些 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 对象具有正确的属性,

PersonDog 将添加方法。如果不是,则返回 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/

相关文章:

javascript - 数字游戏 - 随机

php - 将 MySQL SELECT 返回为 JSON

ruby-on-rails - 如何在 Rails 4 中使用 page.replace_html

javascript - jConfirm 未定义

javascript - 带有 URL 链接且不重复的旋转横幅

javascript - 面对转义反斜杠不断堆积的情况

python - Python 有类原型(prototype)(或前向声明)吗?

javascript - 获取具有特定原型(prototype)的所有元素?

javascript - 在 IE 中查找的替代方法是什么?我收到此错误 TypeError : Object doesn't support property or method 'find'

java - Jackson JSON 处理器 : SerializationConfig. Feature.USE_ANNOTATIONS 设置为 false