如何用函数为JavaScript对象的数组类型成员填充数据?
问题解答:JavaScript对象数组成员通过函数填充数据
当然可以实现这个需求!你遇到的核心问题是对象字面量初始化阶段this的指向不对——在你原来的代码里,make_array(this.num1, this.num2)中的this并不是指向正在创建的test_object,而是当前的执行上下文(比如浏览器环境下的window对象),所以this.num1和this.num2会获取到undefined,自然没法生成正确的数组。
下面给你几种可行的解决方案,每种都有对应的代码示例:
方案1:先创建对象,再手动赋值数组
这是最直观的方法,先定义好对象的基础属性,再调用函数为nums赋值,此时可以直接通过对象名访问num1和num2:
// 先实现你的数组生成函数 function make_array(start, end) { const arr = []; for (let i = start; i <= end; i++) { arr.push(i); } return arr; } // 1. 创建基础对象 var test_object = { num1: 1, num2: 10 }; // 2. 调用函数填充nums属性 test_object.nums = make_array(test_object.num1, test_object.num2); // 测试输出 document.getElementById("demo").innerHTML = test_object.nums;
方案2:使用getter方法懒加载数组
如果希望nums在首次被访问时自动生成(或者支持动态更新),可以用对象的getter语法。如果只想生成一次,可以在getter里缓存结果:
function make_array(start, end) { const arr = []; for (let i = start; i <= end; i++) { arr.push(i); } return arr; } var test_object = { num1: 1, num2: 10, _cachedNums: null, // 用来缓存生成的数组 // 定义getter get nums() { // 如果还没生成过数组,就调用函数生成并缓存 if (!this._cachedNums) { this._cachedNums = make_array(this.num1, this.num2); } return this._cachedNums; } }; // 首次访问nums时会自动生成数组 document.getElementById("demo").innerHTML = test_object.nums;
方案3:用工厂函数创建对象
如果需要创建多个类似的对象,用工厂函数会更灵活——在函数内部可以直接拿到num1和num2的值,再生成数组:
function make_array(start, end) { const arr = []; for (let i = start; i <= end; i++) { arr.push(i); } return arr; } // 工厂函数:负责创建并返回配置好的对象 function createTestObject(num1, num2) { return { num1, num2, nums: make_array(num1, num2) }; } // 创建实例 var test_object = createTestObject(1, 10); document.getElementById("demo").innerHTML = test_object.nums;
这三种方法都能解决你的问题,你可以根据实际需求选择:
- 方案1适合简单的一次性赋值场景;
- 方案2适合需要懒加载或动态更新数组的情况;
- 方案3适合批量创建同类型对象的场景。
内容的提问来源于stack exchange,提问作者cmhodge
相关产品推荐
相关产品推荐

