我想在不使用返回值的情况下包装一些原型(prototype)功能。

以下代码在现代浏览器开发者控制台中返回一个排序列表:

Array.prototype.sor = function() {
  Array.prototype.sort.apply(this);
};
var t = [2,3,1]
t.sor()
t

下面的变化也是如此:
sor = function(l) {
  Array.prototype.sort.apply(l);
};
var t = [2,3,1]
sor(t)
t

是否也可以使用返回结果的非就地原型(prototype)函数(例如 sor 或对于字符串, jointrim )对数组(如 replace 所具有的)造成就地效果?

例如,像这样:
String.prototype.tri = function() {
  String.prototype.trim.apply(this);
};
var t = " 123"
t.tri()
t

理想情况下,这将在浏览器控制台中返回 "123" ( t 的新值)。它不会,因为 String.prototype.trim 返回一个从未被拾取的值。但是,当然,我不能简单地将 this 设置为 trim 后的字符串:
  this = String.prototype.trim.apply(this);

最佳答案

我能想到的唯一方法是使用上下文,并使用括号表示法 context['nameOfVar'] 引用您的变量。

这是可以做到的,因为 JS 变量只不过是一个对象属性(对象是作用域)。

如果您的变量始终在全局范围内声明,则可以执行 window['myVar'] ,但要确保它适用于任何范围,最好使用 this['myVar']

我不确定它是否危险,我只是觉得它很笨拙。如果有人知道,请告诉我们! :)

var joinMe = function(separator, prop) {
  this[prop] = this[prop].join(separator);
};

t = [2,3,1];

joinMe(',', 't');

document.body.innerHTML = t; // "2,3,1"

关于javascript - 从没有副作用的原型(prototype)函数创建具有副作用(就地)的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31451743/

10-13 00:53