我想在不使用返回值的情况下包装一些原型(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
或对于字符串, join
或 trim
)对数组(如 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/