改写Array.prototype.toString

天在join(“”)一个Array的时候遇到一个问题:
当Array中还有Array的时候,嵌套的Array仍然会用逗号连接,而不是指定的空字符。比如

[1,[2,3],4].join("")

的结果是12,34
这不是我想要的。我希望得到1234
首先想到的解决办法就是递归遍历数组,如果元素是数组则对其调用join(“”)。

然后转念一想,递归调用的过程就是Array.prototype.join本身啊。我只需改写Array.prototype.toString就OK了

这是第一个版本:其问题是,如果忘记调用restore或连续调用两次Bakup就完蛋了。

var Bakup = (function(G) {
  var old = null;
  return function(who, name, to) {
    old = who.prototype[name];
    who.prototype[name] = to;
    arguments.callee.restore = function() {
      who.prototype[name] = old;
    };
  };
})();
var tag = ["<", "a ", ["href", "=\"", "http://localhost", "\""], ">"];
Bakup(Array, "toString", function() {
  return this.join("");
});
print(tag);
Bakup.restore();
print(tag);
Bakup(Array, "toString", function() {
  return this.join("-");
});
print(tag);
Bakup.restore();
print(tag);

这是第二个版本:

function Bakup(who, name, to, callback) {
  var old = who.prototype[name];
  who.prototype[name] = to;
  callback();
  who.prototype[name] = old
}
var tag = ["<", "a ", ["href", "=\"", "http://localhost", "\""], ">"];
Bakup(Array, "toString", function() {
  return this.join("");
}, function() {
  print(tag);
});
print(tag);
Bakup(Array, "toString", function() {
  return this.join("-");
}, function() {
  print(tag);
});
print(tag);

Leave a Reply

Your email address will not be published. Required fields are marked *

Scroll to top