从原型函数创建具有副作用(就地)的函数

时间:2015-07-16 10:30:05

标签: javascript

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

以下代码返回现代浏览器开发人员控制台中的排序列表:

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

是否也可以使用返回其结果的非原位原型函数(如sor或者对于字符串,为数组导致数组的原位效果(如join所有)) trimreplace

例如,像这样:

String.prototype.tri = function() {
  String.prototype.trim.apply(this);
};
var t = " 123"
t.tri()
t

理想情况下,哪个会在浏览器控制台中返回"123"t的新值)。它没有,因为String.prototype.trim返回一个永远不会被拾取的值。但是,当然,我不能简单地将this设置为修剪过的字符串:

  this = String.prototype.trim.apply(this);

1 个答案:

答案 0 :(得分:2)

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

这可以做到,因为JS变量只是一个Object属性(Object是范围)。

如果变量总是在全局范围内声明,则可以window['myVar'],但为了确保它适用于任何范围,最好使用this['myVar']

我不确定它是否危险,我只是发现 hacky 。如果有人知道,请告诉我们! :)

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

t = [2,3,1];

joinMe(',', 't');

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