在下面的代码中用JavaScript实现工厂模式的正确方法

在下面的代码中用JavaScript实现工厂模式的正确方法,javascript,optimization,scope,factory,Javascript,Optimization,Scope,Factory,下面的代码应该是为涉及Arduino的项目提取一个温度传感器 我有表示硬件传感器的传感器函数、创建传感器实例的传感器工厂函数和存储/返回阵列中传感器对象的saveSensor/findSensor函数 var sensors = []; const Sensor = (sensorId, sensorType, sensorName) =>{ var temperature; let sensor = { sensorId, sensorTy

下面的代码应该是为涉及Arduino的项目提取一个温度传感器

我有表示硬件传感器的传感器函数、创建传感器实例的传感器工厂函数和存储/返回阵列中传感器对象的saveSensor/findSensor函数

var sensors = [];
const Sensor = (sensorId, sensorType, sensorName) =>{
    var temperature;
    let sensor = {
        sensorId,
        sensorType,
        sensorName,
        temperature,
        readTemperature: (temp) => {
            temperature = temp //simulates reading from hardware
        },
        getTemperature: () => {
            console.log(temperature)
        }
    }
    return sensor; 
};
const SensorFactory = () =>({
    createSensor: (sensorId, sensorType, sensorName) => {
        var sensor = {};
        switch(sensorType){
            case "DS18B20":         
                sensor = Sensor(sensorId,sensorType, sensorName);
                saveSensor(sensor);
                return findSensor(sensorId);
                break;
        }
    },
    getSensor: (sensorId) =>{
    if (sensorId){
            return findSensor(sensorId);            
        }
        return sensors;
    }
});
const saveSensor = (sensor) => {
    sensors.push(sensor);
};
const findSensor = (sensorId) => {
    return sensors[sensorId -1];
};
module.exports = SensorFactory;
我有两个问题:

  • 为什么在运行行
    console.log(JSON.stringify(sensor1))
    时看不到温度变量的值

  • 预期:

    {"sensorId":1,"sensorType":"DS18B20","sensorName":"Cryogenic Tank", "temperature": 10}
    
    实际产量:

    {"sensorId":1,"sensorType":"DS18B20","sensorName":"Cryogenic Tank"}
    
    我相信下面代码块中的温度(A)是一个私有变量,因此不应该从对象外部访问它,但是当我运行
    console.log(JSON.stringify(sensor1))
    时,我是否应该能够看到温度变量(B)

    const Sensor=(传感器ID、传感器类型、传感器名称)=>{
    var温度;{
    console.log('getTemperature');
    console.log(温度);}
    }
    返回传感器;
    };
    
  • 我对JS很生疏。你能帮我理解我在概念上的错误吗?您将如何修改代码以使其按预期工作

  • 下面是对现代Javascript的一些重构(回答了第二个问题,作为副作用,也是第一个问题;)

    类传感器{
    构造函数(id、类型、名称){
    this.id=id
    this.type=type
    this.name=name
    该温度为零
    }
    读取温度(温度){
    this.temperature=temp//模拟从硬件读取数据
    }
    }
    类SensorSet扩展了Map{
    添加(id、类型、名称){
    此.set(id,新传感器(id,类型,名称))
    返回此。获取(id)
    }
    }
    让传感器=新传感器集()
    传感器。增加(1,“DS18B20”,“低温罐”)
    设s1=传感器。获取(1)
    s1.读取温度(200)
    控制台日志(s1.温度)
    s1.读取温度(100)
    控制台日志(s1.温度)
    s1.读取温度(10)
    控制台日志(s1.温度)
    
    console.log(JSON.stringify(s1))
    @Bergi的第二条评论是我问题的解决方案。我也遵循了他的建议,删除了返回sensorFactory对象的sensorFactory函数。代码现在已经很清楚了。

    谢谢。我应该澄清一下,我是在试图避免使用类。道歉。您建议如何仅使用函数来实现这一点?“避免使用类”-为什么?我在使用类时遇到了pass绑定问题,并且我已经读到我应该更喜欢函数而不是类,即函数组合而不是继承,即。你的代码很清晰,这是我用PHP编写代码的方式,非常有意义。然而,我发现过去使用函数和组合比使用类和继承更容易。我将继续处理这个问题并发布我的更新。@acanessa:我明白了。不幸的是,互联网上充斥着误导性的东西,如果不是完全错误的话(这是第一个链接)。我的建议是,只要你觉得舒服,就坚持做。祝你的项目好运!为什么
    SensorFactory
    是一个返回工厂对象的函数?似乎所有的工厂都是一样的。只需使用
    module.exports={createSensor(…){…},getSensor(…){…}
    “为什么我看不到温度变量的值”-因为
    JSON.stringify
    只打印
    .temperature
    对象属性的值,而不是
    readTemperature
    方法指定的
    temperature
    局部变量。改为使用
    getTemperature()
    并从对象中删除不可变属性-或者从代码中删除变量并始终访问该属性。@Bergi这对我来说是解决方案的一大部分。我试图偷懒,看到readTemperature在将对象传递给Handlebar模板之前更改了温度变量的值。另外,我忘了在
    getTemperature
    方法中添加
    returntemperature
    行。我的代码现在按预期工作。当你说“为什么传感器工厂是返回工厂对象的函数”时,你能帮助我理解你的意思吗?我的想法是让传感器工厂返回不同类型的传感器对象。“我的想法是让传感器工厂返回不同类型的传感器对象。”-是的,传感器工厂应该这样做,与具体的
    sensorFactory
    一样,它使用
    createSensor
    方法。但是为什么你有一个
    SensorFactory
    函数来创建工厂呢?@Bergi:因为我不是程序员,所以有些概念让我感到困惑。我理解你现在的要求,事实上,我在另一个模块中遵循你的建议,并按照你的建议进行导出。
    {"sensorId":1,"sensorType":"DS18B20","sensorName":"Cryogenic Tank"}
    
    const Sensor = (sensorId, sensorType, sensorName) =>{
        var temperature; <----A----private. 
        let sensor = {
            sensorId,
            sensorType,
            sensorName,
            temperature, <----B----I should be able to see this, right?
            readTemperature: (temp) => {
                temperature = temp;
                console.log('readTemperature');             
            },
            getTemperature: () => {             
                console.log('getTemperature');
                console.log(temperature);           }
        }
        return sensor;
    };