向现有Javascript对象添加方法的最佳方法

Eri*_* H. 10 javascript prototype

我收到一个类似于此的文档的ajax feed(非常简化):

aDocs = [{title:'new doc', ext:'pdf'}, {title:'another', ext:'xlsx'}];
Run Code Online (Sandbox Code Playgroud)

我将遍历aDocs数组并显示有关每个文档的信息,同时向每个文档添加一些方法,这些方法将允许修改HTML以进行显示并进行API调用以更新数据库.

在这里读到,为了向现有对象添加方法,您可以使用该__proto__属性.有点像:

function Doc(){}
Doc.prototype.getExt = function(){return this.ext}
Doc.prototype.getTitle = function(){return this.title}
for (var i=0; i<aDocs.length; i++){
  aDocs[i].__proto__ = Doc.prototype
}
Run Code Online (Sandbox Code Playgroud)

根据上面的那篇文章,这不是官方的javascript,IE不支持(永远不会),并且很可能在webkit浏览器中被弃用.

这是另一种选择:

function getExt(){ return this.ext }
function getTitle(){return this.title}
for (var i=0; i<aDocs.length; i++){
  aDocs[i].getExt = getExt;
  aDocs[i].getTitle = getTitle;
}
Run Code Online (Sandbox Code Playgroud)

这第二种选择是否可行且有效?或者我是否重新创建这些功能,从而产生多余的开销?

再次简化上面的例子(我知道aDocs[i].ext将解决上面的问题,但我的显示和API调用方法更复杂).

T.J*_*der 8

这第二种选择是否可行且有效?

是.

或者我是否重新创建这些功能,从而产生多余的开销?

不,这些功能可以重复使用,而不是重新创建.所有对象将共享和函数的单个副本.在(例如)调用函数期间,在调用中,将引用函数所附加的对象.(这仅适用于您将其称为从对象检索它的表达式的一部分,例如,)getExtgetTitleaDocs[1]thisvar title = aDocs[1].getTitle();

或者,如果您喜欢,可以创建共享原型aDocs的新对象,并将对象的属性复制到新对象,但是您已经询问了如何为现有对象分配新功能,所以......