如何在JavaScript的datasets对象内部调用自身属性生成fullName?
JavaScript对象内部引用自身属性创建fullName的解决方案
在对象字面量初始化阶段,this并不指向当前正在创建的datasets对象,而是指向外层执行上下文(浏览器环境下通常是window,严格模式下为undefined),所以直接用this.cst_TEST会触发找不到属性的错误。以下是两种可行的解决方法:
方案1:先初始化对象,再追加fullName属性
先创建不含fullName的基础对象,之后通过对象名直接引用内部属性完成赋值:
var datasets = { cst_TEST: { firstName: "John", lastName: "Deacon" }, glb_TEST: { age: "30" } }; // 追加fullName属性 datasets.fullName = datasets.cst_TEST.firstName + " " + datasets.cst_TEST.lastName; var kOBJ = { fxAAA(){ console.log("First Name: " + datasets.cst_TEST.firstName); }, fxBBB(){ console.log("Last Name: " + datasets.cst_TEST.lastName); }, fxCCC(){ console.log("Age: " + datasets.glb_TEST.age); }, fxDDD(){ console.log("Full Name: " + datasets.fullName); } }; // 调用测试 kOBJ.fxAAA(); // 输出: First Name: John kOBJ.fxBBB(); // 输出: Last Name: Deacon kOBJ.fxCCC(); // 输出: Age: 30 kOBJ.fxDDD(); // 输出: Full Name: John Deacon
方案2:使用getter方法(推荐,支持动态更新)
将fullName定义为对象的getter属性,每次访问时都会动态计算,此时this会正确指向当前对象:
var datasets = { cst_TEST: { firstName: "John", lastName: "Deacon" }, glb_TEST: { age: "30" }, // 定义getter get fullName() { return this.cst_TEST.firstName + " " + this.cst_TEST.lastName; } }; var kOBJ = { fxAAA(){ console.log("First Name: " + datasets.cst_TEST.firstName); }, fxBBB(){ console.log("Last Name: " + datasets.cst_TEST.lastName); }, fxCCC(){ console.log("Age: " + datasets.glb_TEST.age); }, fxDDD(){ console.log("Full Name: " + datasets.fullName); } }; // 调用测试 kOBJ.fxDDD(); // 输出: Full Name: John Deacon // 动态修改属性后,fullName会自动更新 datasets.cst_TEST.firstName = "Freddie"; kOBJ.fxDDD(); // 输出: Full Name: Freddie Deacon
两种方案区别:方案1是一次性赋值,后续修改firstName/lastName不会同步更新fullName;方案2是动态计算,每次访问都会取最新属性值,适合需要动态更新的场景。
内容的提问来源于stack exchange,提问作者brut65
相关产品推荐
相关产品推荐

