gpt4 book ai didi

javascript - dojo 声明类变量未定义

转载 作者:行者123 更新时间:2023-11-29 09:54:10 24 4
gpt4 key购买 nike

我正在学习将 dojo 用于我即将进行的项目,因此提前承认这可能是一个非常基本的问题。我试图找到答案但没有成功。此外,我不得不使用稍旧版本的 dojo - 1.6 我认为没有 AMD。

我已经使用 dojo.declare 声明了一个类,这里​​是一个稍微修改过的例子:

dojo.declare("myNamespace.CustomClass", null, {
firstProperty: "The default value",
constructor: function () { }
Test: function () {
alert(this.firstProperty);
}
});

因此,本质上,一个名为 CustomClass 的类具有一个名为 firstProperty 的公共(public)属性,其默认值为“默认值”,一个当前不执行任何操作的构造函数和一个名为 Test 的公共(public)方法,该方法在调用时会发出警报firstProperty 的值。

我的假设是,当我创建 CustomClass 的实例并调用 Test() 时,我会得到一个带有“默认值”的警告框。但是,我没有,而是收到一个带有“未定义”的警告框。如果我在创建实例后设置 firstProperty 的值,然后调用 Test,它会起作用,并且我会得到属性设置的任何值。因此,一种解决方法是在构造函数中设置默认值,但我读过的内容表明它应该按照我假设的方式工作,所以我宁愿正确地做。

我也试过在构造函数中调用 dojo.safeMixin(this, null),因为我读到的东西让我想知道这是否是必需的,但它没有什么不同。

提前感谢您阅读本文!西蒙

最佳答案

您缺少的关键概念是范围的概念。当您执行 alert(firstProperty); 时,您指的是局部变量 firstProperty。其中,在您的情况下,您没有定义任何具有该名称的局部变量。但是,您已经使用该名称定义了一个实例 变量。与 java 等语言不同,实例变量必须使用 this 显式访问。

所以你的例子应该是:

dojo.declare("myNamespace.CustomClass", null, {
firstProperty: "The default value",
constructor:function(params){
console.log(params);
dojo.safeMixin(this,params);
},
Test: function () {
alert(this.firstProperty);
}

});

var myInstance = new myNamespace.CustomClass({firstProperty:'something else'});
myInstance.Test();

您可能还想看看 Javascript Scope Tricks ,因为 JavaScript 中的作用域可能会变得非常棘手。

编辑:我意识到你不是从 dijit._Widget 继承的。在这种情况下,您需要使用 dojo.safeMixin 将构造函数参数手动应用到实例。我更新了上面的代码示例。我还创建了一个 simple jsfiddle演示代码。

关于javascript - dojo 声明类变量未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com