我有这个模块:
cancel()
如您所见,我尝试在exports.yeah = {
hallo: {
shine: "was",
yum: this.hallo.shine
}
}
但是当我尝试执行我的脚本时,我收到此错误:
yum: this.hallo.shine
似乎范围错了!
我尝试了不同的东西,例如TypeError: Cannot read property 'shine' of undefined
但它根本行不通!如何解决此错误? 感谢
答案 0 :(得分:2)
当您引用this.hallo
时,VM仍在创建对象,但尚未将其分配给hallo
。您需要稍后初始化该字段。
为了建立你的榜样:
exports.yeah = {
hallo: {
shine: "was",
yum: this.hallo.shine
}
}
VM需要创建
{
shine: "was",
yum: this.hallo.shine
}
并在创建时将其分配给hallo
{
hallo: {
shine: "was",
yum: this.hallo.shine
}
}
然后分配给exports.yeah
。
这很像在调用函数之前计算的函数参数。
当您引用this.hallo.shine
时,尚未创建该链。由于您正在使用对象文字,因此您不能依赖this.shine
,因为this
指向范围。
您需要使用延迟(r)初始化,例如:
exports.yeah = {
hallo: {
shine: "was"
}
}
exports.yeah.hallo.yum = exports.yeah.hallo.shine;
答案 1 :(得分:2)
您可以使用javascript getters
var exports = {};
exports.yeah = {
hallo: {
shine: "was",
get yum() {
return this.shine
}
}
};
document.write(exports.yeah.hallo.yum);

注意,this
上下文中的getter
会引用hallo
而非yeah
根据文件
get语法将对象属性绑定到将要的函数 查找该属性时调用。
因为在对象初始化之后调用了getter函数(查找),this
可用于引用shine
<强>更新强>
让我们说对象的构建方式与{hallo1:{..},hallo2:{..}}相同。现在我想在hallo1.yum = hallo2.shine中引用这可能吗?
是的,这是可能的,因为在获取时,对象已初始化,您可以引用对象本身而不是this
var exports = {};
exports.yeah = {
hallo1: {
shine: "was",
get yum() {
return exports.yeah.hallo2.yum;
}
},
hallo2: {
shine: "is",
get yum() {
return this.shine;
}
}
};
document.write(exports.yeah.hallo1.yum);
&#13;