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

向现有Javascript对象添加方法的最佳方法,javascript,prototype,Javascript,Prototype,我收到一个ajax文档提要,看起来像这样(简化了很多): 我将遍历aDocs数组并显示关于每个文档的信息,同时向每个文档添加一些方法,这些方法将允许修改用于显示的HTML并进行API调用以更新数据库 我了解到,为了向现有对象添加方法,可以使用\uuu proto\uu属性。大致如下: function Doc(){} Doc.prototype.getExt = function(){return this.ext} Doc.prototype.getTitle = function(){ret

我收到一个ajax文档提要,看起来像这样(简化了很多):

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

我了解到,为了向现有对象添加方法,可以使用
\uuu proto\uu
属性。大致如下:

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
}
函数Doc(){}
Doc.prototype.getExt=function(){返回this.ext}
Doc.prototype.getTitle=function(){返回this.title}
对于(var i=0;i
第二种选择是否可行且有效

还是我在重新创建这些函数,从而产生多余的开销

不,函数是重复使用的,而不是重新创建的。所有对象都将共享
getExt
getTitle
函数的单个副本。在从(比如)aDocs[1]
调用函数期间,在调用中,
将引用函数附加到的对象。(这仅适用于将其作为从对象检索它的表达式的一部分调用,例如,
var title=aDocs[1].getTitle();


或者,如果您愿意,您可以创建共享原型的新对象,并将属性从
aDocs
对象复制到新对象,但您要求将新函数分配给现有对象,因此…

在本例中,我只需将对象传递给Doc的构造函数

function Doc(obj){
   this.obj = obj;
}

Doc.prototype.getExt = function(){
    return this.obj.ext;
}
Doc.prototype.getTitle = function(){
   return this.obj.title;
}

var docs = [];
for (var i=0; i<aDocs.length; i++){
  docs.push(new Doc(aDocs[i]));
}
功能文档(obj){
this.obj=obj;
}
Doc.prototype.getExt=函数(){
返回this.obj.ext;
}
Doc.prototype.getTitle=函数(){
返回此.obj.title;
}
var文件=[];
对于(var i=0;i来说,增加原型(向原型添加方法)通常是最好的方法,但是因为您处理的是对象文本(或JSON.parse结果),您必须要么扩充
对象.prototype
,这是未完成的,要么创建一个包装构造函数,并将所需的方法附加到其原型。问题是:在这种情况下……我会保持原样:使用第二种方法:一个简单的循环即可e、 除此之外:原型方法无论如何(稍微)要慢一些

函数对象本身正在尽快创建(如果它们是在全局命名空间中定义的,则在脚本解析后立即创建)。通过简单地循环这些对象,并为每个对象分配对任何函数的引用,您根本就不会创建其他函数。
试试这个:

var someObj = {name:'someObj'}, 
anotherObj = {name: 'anotherObj'},
someFunction = function()
{
    console.log(this);
};
someObj.func = someFunction;
anotherObj.func = someFunction;
//or, shorter
someObj.func = anotherObj.func = someFunction;
//therefore:
console.log(someObj.func === anotherObj.func);//logs true! there is only 1 function object
someObj.func();//logs {name: 'someObj'}
anotherObj.func();//logs: {name: 'anotherObj'}
有许多问题(和答案)更深入地讨论了这一问题,因此,如果您感兴趣:





这些都或多或少地与你的问题有关

你尝试过的东西有什么问题?谢谢你的回答和资源。我给了TJ答案b/c他之前有答案,这里有所有的要点。但是额外的资源+1。
function Doc(obj){
   this.obj = obj;
}

Doc.prototype.getExt = function(){
    return this.obj.ext;
}
Doc.prototype.getTitle = function(){
   return this.obj.title;
}

var docs = [];
for (var i=0; i<aDocs.length; i++){
  docs.push(new Doc(aDocs[i]));
}
var someObj = {name:'someObj'}, 
anotherObj = {name: 'anotherObj'},
someFunction = function()
{
    console.log(this);
};
someObj.func = someFunction;
anotherObj.func = someFunction;
//or, shorter
someObj.func = anotherObj.func = someFunction;
//therefore:
console.log(someObj.func === anotherObj.func);//logs true! there is only 1 function object
someObj.func();//logs {name: 'someObj'}
anotherObj.func();//logs: {name: 'anotherObj'}