JavaScript中如何创建包含其他对象实例数组的对象
实现包含对象数组的Layer结构
你当前的代码存在语法错误和实例共享的逻辑问题,无法直接生成独立的Neuron实例,以下是可直接运行的正确实现。
推荐写法:ES6 Class
现代JavaScript环境优先用类语法,结构清晰可读性强:
class Neuron { constructor() { // 实例独有属性放在构造函数中,避免多实例共享 this.value = 0; this.links = []; } activate() { // 必须加this指代当前神经元实例,否则会污染全局变量 this.value = 1 / (1 + Math.exp(-this.value)); } } class Layer { // 初始化时传入当前层需要的神经元数量 constructor(neuronCount) { // 生成指定数量的Neuron实例存入数组 this.neurons = Array.from({ length: neuronCount }, () => new Neuron()); } } // 使用示例:创建包含3个神经元的隐藏层 const hiddenLayer = new Layer(3); // 操作第一个神经元 hiddenLayer.neurons[0].value = 1.5; hiddenLayer.neurons[0].activate();
兼容写法:构造函数
如果需要兼容不支持ES6语法的老旧环境,可以用原型链构造函数的写法:
function Neuron() { this.value = 0; this.links = []; } // 方法挂载到原型,所有实例共用节省内存 Neuron.prototype.activate = function() { this.value = 1 / (1 + Math.exp(-this.value)); } function Layer(neuronCount) { this.neurons = []; for (let i = 0; i < neuronCount; i++) { this.neurons.push(new Neuron()); } } // 使用方式和类写法完全一致 const outputLayer = new Layer(2);
原代码需要修正的问题
- 你定义的
Neuron是普通对象字面量,属于单例,所有引用指向同一个对象,根本无法通过new生成独立实例,不符合神经网络每层多个独立神经元的需求 - 对象属性之间漏写逗号分隔,会直接抛出语法错误
activate方法内的value没有加this前缀,赋值时会创建全局变量,不会修改当前神经元的属性- 不要把数组、对象这类引用类型值直接挂在共享原型上,否则所有实例会共用同一个引用,一个实例修改数据会影响所有其他实例
内容的提问来源于stack exchange,提问作者Manuel Vázquez
相关产品推荐
相关产品推荐

