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

标签 javascript prototype

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

aDocs = [{title:'new doc', ext:'pdf'}, {title:'another', ext:'xlsx'}];

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

我读了here为了向现有对象添加方法,您可以使用 __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
}

根据上面那篇文章,这不是官方的 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;
}

这第二种选择可行且有效吗?还是我重新创建了这些函数,从而产生了多余的开销?

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

最佳答案

Is this second alternative viable and efficient?

是的。

Or am I re-creating those functions and thereby creating redundant overhead?

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

或者,如果您愿意,您可以创建共享原型(prototype)的新对象,并将属性从 aDocs 对象复制到新对象,但您已经询问过将新函数分配给 < em>现有对象,所以...

关于javascript - 向现有 Javascript 对象添加方法的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15367316/

相关文章:

javascript - jQuery 不会在第一次点击时触发,但在第二次点击时触发

javascript - JavaScript 文件中的 PHP

javascript - 为什么我不能在方法中引用从 JavaScript 原型(prototype)继承的方法

javascript - 如何在 Typescript 中显式识别全局命名空间中的实体?

javascript - 对象不拥有显式设置的 __proto__ 是什么?

javascript - 涉及对象和原型(prototype)的属性继承

javascript - GAE node.js console.error() 未记录为 ERROR 日志级别

javascript - 执行 Rails 代码的 JS 按钮

javascript - 如何创建登录和注册页面而无需连接到后端(ReactJS + Redux)?

javascript - 如何将控制事件绑定(bind)到使用 javascript 原型(prototype)声明的函数