克隆原型功能保持范围

时间:2015-06-06 13:30:31

标签: javascript prototype

我有一个奇怪的用例,但在这里它(下面是一个例子,但方法的命名有所不同);

我正在使用的对象上有一个原型函数名bootstrap,它调用函数create。我想修改它(不更改原型)以便调用createCustom。为此,我toString()使用原型函数,在create - > createCustom上执行字符串替换,然后eval将其返回到函数。

问题是bootstrap函数内部有this的多个引用,看来我的克隆函数不再具有相同的范围(预期的类型)。

任何想法,如果我可以绑定某个上下文,让它回到克隆方法应该是什么?不幸的是,到目前为止,我没有尝试过任何工作。

我意识到获得我想要的东西的方法很混乱,但是我的双手被束缚了。提前谢谢!

1 个答案:

答案 0 :(得分:1)

获得eval'd功能后,您可以通过Function#callFunction#apply使用任意this值来调用它:

// Call f with `this` referring to `obj`, arguments 1, 2, and 3
f.call(obj, 1, 2, 3);

// Same thing, note how the arguments are passed as an array
f.apply(obj, [1, 2, 3]);

直播示例:

function Foo(name) {
  this.name = name;
}
Foo.prototype.bootstrap = function() {
  create(this.name);
};
var obj = new Foo("The object");

// Not that I recommend doing this!
var f = eval("(" + obj.bootstrap.toString().replace(/\bcreate\b/g, "createCustom") + ")");
snippet.log("b");

snippet.log("Executing: obj.bootstrap()");
obj.bootstrap();
snippet.log("Executing: f.call(obj)");
f.call(obj);

function create(n) {
  snippet.log("create called with '" + n + "'");
}

function createCustom(n) {
  snippet.log("createCustom called with '" + n + "'");
}
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>