向许多元素添加相同的函数(使用js原型?)

时间:2010-11-28 23:48:13

标签: javascript

在我的应用程序中,我收到了一组带有JSON的评论。

然后,我想为此集合中的每个项目添加函数,例如,如果评论有comment.first_namecomment.last_name,我想构建comment.full_name()

到目前为止,我正在做:

comment.full_name = function() { return this.first_name+" "+this.last_name }

我的问题是,由于有很多评论(和其他方法比这个更复杂),我怎样才能使用原型构造函数来添加相同的功能集合中的每个项目,而不是将其插入每个元素?

修改

以下是代码示例:

comments = ({"1": {"first_name":"John", "last_name":"Silver"}, "2": {"first_name":"Jack", "last_name":"Sparrow"}})

现在,我正在寻找会返回的东西

comments[1].name() //=> John Silver
comments[2].name() //=> Jack Sparrow

2 个答案:

答案 0 :(得分:1)

鉴于JSON没有封装任何有关类型的信息,我不确定如果不将该方法添加到对象原型中,就可以执行此操作。这是否可取是一个需要辩论的主题。一旦你从JSON解析器获得了数据,最好一次一个地打击对象(就像你现在看到的那样)。

答案 1 :(得分:1)

要回答您的直接问题,您可以通过附加来附加到对象的原型,并使用prototype关键字将其附加到原型链。要将函数full_name()附加到comment对象的原型,您可以执行以下操作:

comment.prototype.full_name = function () {
  if (typeof(this.first_name) !== "undefined" && typeof(this.last_name) !== "undefined") {
    return this.first_name + " " + this.last_name;
  } else {
    return ""
  }
};

编辑:

以上代码也适用于您的情况。它会将属性full_name附加到JSON对象中的每个值。 full_name是一个功能。只要两个属性都不是first_name,它将返回包含当前对象的last_name属性,空格和当前对象的undefined属性的连接字符串。如果其中一个或两个都是,则会返回empty string