几天前,当我想用JavaScript创建一个类时,我发现了prototypejs。 我有一些完美的功能,绘制如下的配置文件: My Race Profile
要使用任何数据创建此配置文件,我想创建一个完整的类。
以下是 codepen.
上的代码所以,解释我的问题:
我在构造函数中声明了我的变量。
当我使用var rp = new RaceProfile('data.json', 'markers.json');
时,我没有任何问题。我的所有变量都是用好的值创建的。
但是,当我使用" rp.profile(data);
",之前声明的所有变量都是未定义的。似乎之前定义的所有值都被删除了。而且我的代码因此无法工作。
如果有人知道问题的来源,请告诉我:)
答案 0 :(得分:0)
当你说"所有变量"时,你在谈论" xScale"," yScale" ......? 因为这些变量不能在轮廓函数中达到,实际上" var"变量仅在其当前范围内可见(在{}之间)。
要在类功能中访问变量,你必须使用"这个"像dataProfile字段的关键字:
var RaceProfile = Class.create({
initialize: function (dataProfile, dataCP) {
this.dataProfile = dataProfile;
this.dataCP = dataCP;
this.xScale = d3.scaleLinear();
}
现在您可以在其他功能中访问这些变量。
更多信息在JS中,默认情况下#34;这个"是一个上下文关键字,可以了解有关它的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
"这"是通过所有对象函数共享,但匿名函数有自己的(匿名函数不附加到您的对象)。
这样无法正常工作,您无法直接访问xScale:
profile: function (rawData) {
d3.json(this.dataProfile, function (error, rawData) {
// ..
this.xScale.range([0, width]).domain(d3.extent(data, function (d) {
return d.distance;
}));
你必须保存"这个"您的对象在变量中的作用:
profile: function (rawData) {
var self = this;
d3.json(this.dataProfile, function (error, rawData) {
// ..
self.xScale.range([0, width]).domain(d3.extent(data, function (d) {
return d.distance;
}));