克隆原型函数保持作用域
Clone prototype function keeping scope
我有一个有点奇怪的用例,但就是这样(下面是一个例子,但方法的命名有些不同);
我正在使用的对象上有一个原型函数名称 bootstrap
,它调用一个函数 create
。我想修改它(不更改原型)以便调用 createCustom
。为此,我正在 toString()
原型函数,在 create
->createCustom
上进行字符串替换,然后 eval
将其返回到函数。
问题是 bootstrap
函数内部有多个对 this
的引用,看来我的克隆函数不再具有相同的作用域(有点符合预期)。
我是否可以绑定某个上下文以使其恢复到克隆方法中应有的状态,有什么想法吗?不幸的是,到目前为止我所尝试的一切都没有奏效。
我意识到上面得到我想要的东西的方法很乱,但我的手被束缚了。提前致谢!
获得 eval
函数后,您可以通过 Function#call
or Function#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>
我有一个有点奇怪的用例,但就是这样(下面是一个例子,但方法的命名有些不同);
我正在使用的对象上有一个原型函数名称 bootstrap
,它调用一个函数 create
。我想修改它(不更改原型)以便调用 createCustom
。为此,我正在 toString()
原型函数,在 create
->createCustom
上进行字符串替换,然后 eval
将其返回到函数。
问题是 bootstrap
函数内部有多个对 this
的引用,看来我的克隆函数不再具有相同的作用域(有点符合预期)。
我是否可以绑定某个上下文以使其恢复到克隆方法中应有的状态,有什么想法吗?不幸的是,到目前为止我所尝试的一切都没有奏效。
我意识到上面得到我想要的东西的方法很乱,但我的手被束缚了。提前致谢!
获得 eval
函数后,您可以通过 Function#call
or Function#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>