首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用以下代码在JavaScript中实现工厂模式的正确方法

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

Stack Overflow用户
提问于 2021-04-20 18:09:55
回答 2查看 109关注 0票数 0

下面的代码应该为涉及Arduino的项目抽象一个温度传感器。

我有表示硬件传感器的传感器函数,用于创建传感器实例的sensorFactory函数,以及存储/从数组中返回传感器对象的saveSensor / findSensor函数。

代码语言:javascript
复制
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;

我有两个问题:

为什么在运行行

  1. 时不能看到温度变量的值?

const SensorFactory =需要量(“./senor.js”);var sensorFactory = SensorFactory();sensorFactory.createSensor (1,"DS18B20",“低温储罐”);var sensor1 = sensorFactory.getSensor(1);senor1.readTemperature( 200 );senor1.getTemperature(200);//prints 200 sensor1.readTemperature( 100 );//print 100 sensor1.getTemperature();sensorFactory.createSensor 1.sensor1.getTemperature( 10 );//打印10个温度传感器(10);

预期:

代码语言:javascript
复制
{"sensorId":1,"sensorType":"DS18B20","sensorName":"Cryogenic Tank", "temperature": 10}

实际产出:

代码语言:javascript
复制
{"sensorId":1,"sensorType":"DS18B20","sensorName":"Cryogenic Tank"}

我认为以下块中的温度(A)是一个私有变量,因此不应该从对象外部访问它,但在运行console.log(JSON.stringify(sensor1))时不应该看到温度变量(B)吗?

代码语言:javascript
复制
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;
};

  1. 我对JS很生疏。你能帮我弄清楚我在概念上哪里错了吗?如何修改代码以使其按预期工作?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-26 02:34:54

@Bergi的第二个评论是我的问题的解决方案。我还遵循了他的建议,并消除了返回sensorFactory对象的sensorFactory函数。代码现在很清楚了。

票数 0
EN

Stack Overflow用户

发布于 2021-04-20 18:29:06

这里有一些重构到现代Javascript (回答第二个问题,并作为一个副作用,也是第一个;)

代码语言:javascript
复制
class Sensor {
    constructor(id, type, name) {
        this.id = id
        this.type = type
        this.name = name
        this.temperature = null
    }

    readTemperature(temp) {
        this.temperature = temp //simulates reading from hardware
    }
}


class SensorSet extends Map {
    add(id, type, name) {
        this.set(id, new Sensor(id, type, name))
        return this.get(id)
    }
}

let sensors = new SensorSet()

sensors.add(1, "DS18B20", "Cryogenic Tank")

let s1 = sensors.get(1)

s1.readTemperature(200)
console.log(s1.temperature)

s1.readTemperature(100)
console.log(s1.temperature)

s1.readTemperature(10)
console.log(s1.temperature)

console.log(JSON.stringify(s1))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67184192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档