引用其他对象键

时间:2015-06-10 19:30:57

标签: javascript node.js

我有这个模块:

cancel()

如您所见,我尝试在exports.yeah = { hallo: { shine: "was", yum: this.hallo.shine } }

中引用 shine

但是当我尝试执行我的脚本时,我收到此错误:

yum: this.hallo.shine

似乎范围错了!

我尝试了不同的东西,例如TypeError: Cannot read property 'shine' of undefined

但它根本行不通!如何解决此错误? 感谢

2 个答案:

答案 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

&#13;
&#13;
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;
&#13;
&#13;