使用 require 设置原型自执行函数时浏览上下文
Browserify context when setting a prototype self executing function with require
我有一个 "class" 像这样:
function Person(params) {
this.params = params;
}
我想这样定义原型:
Person.prototype.talk = require("./talk.js")(options);
和内部 talk.js:
module.exports = exports = function(options) {
console.log(this); // window here not person
return {};
};
但在 talk.js 里面 this
不是指创建的新 Person 对象...
上下文是 window
这是必须做的,因为要求正在传递一些设置...
有什么方法可以传递/保留 talk.js 中的上下文吗?
问题与 require(...)
调用无关,它与调用导出函数的 when 和 how 有关.
当你这样做时
Person.prototype.talk = require("./talk.js")(options);
你是 "requiring"(导入...)来自 "talk.js" 的代码,这是一个函数,你可以立即使用参数调用它(options
),但是没有任何上下文对象,因此使用默认值 (window
)。
你显然想要的是在函数内部有一个实例作为 this
可用,但在你调用它时,没有 Person
class 的实例可用。
稍后在实例上调用 talk()
时,实例将作为 this
值存在。
如果你想让talk
成为日志功能,只需在原型中设置它而不调用它:
Person.prototype.talk = require("./talk.js");
// later...
var p = new Person("some parameter");
p.talk("some option"); // <- this will log the instance.
我有一个 "class" 像这样:
function Person(params) {
this.params = params;
}
我想这样定义原型:
Person.prototype.talk = require("./talk.js")(options);
和内部 talk.js:
module.exports = exports = function(options) {
console.log(this); // window here not person
return {};
};
但在 talk.js 里面 this
不是指创建的新 Person 对象...
上下文是 window
这是必须做的,因为要求正在传递一些设置... 有什么方法可以传递/保留 talk.js 中的上下文吗?
问题与 require(...)
调用无关,它与调用导出函数的 when 和 how 有关.
当你这样做时
Person.prototype.talk = require("./talk.js")(options);
你是 "requiring"(导入...)来自 "talk.js" 的代码,这是一个函数,你可以立即使用参数调用它(options
),但是没有任何上下文对象,因此使用默认值 (window
)。
你显然想要的是在函数内部有一个实例作为 this
可用,但在你调用它时,没有 Person
class 的实例可用。
稍后在实例上调用 talk()
时,实例将作为 this
值存在。
如果你想让talk
成为日志功能,只需在原型中设置它而不调用它:
Person.prototype.talk = require("./talk.js");
// later...
var p = new Person("some parameter");
p.talk("some option"); // <- this will log the instance.