如何解决在以下代码中用 JavaScript 实现工厂模式的正确方法
以下代码应该为涉及 Arduino 的项目抽象一个温度传感器。
我有代表硬件传感器的 Sensor 函数,一个用于创建传感器实例的 sensorFactory 函数,以及一个用于存储/返回数组中的传感器对象的 saveSensor / findSensor 函数。
#our first calculations
quarter_1_sales <- 35657.98
quarter_2_sales <- 43810.55
midyear_sales <- quarter_1_sales + quarter_2_sales
print(midyear_sales)
# or just type
midyear_sales
我有两个问题:
-
为什么我在运行
var sensors = []; const Sensor = (sensorId,sensorType,sensorName) =>{ var temperature; let sensor = { sensorId,sensorName,temperature,readTemperature: (temp) => { temperature = temp //simulates reading from hardware },getTemperature: () => { console.log(temperature) } } return sensor; }; const SensorFactory = () =>({ createSensor: (sensorId,sensorName) => { var sensor = {}; switch(sensorType){ case "DS18B20": sensor = Sensor(sensorId,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))
预期:
const SensorFactory = require ("./sensor.js");
var sensorFactory = SensorFactory();
sensorFactory.createSensor (1,"DS18B20","Cryogenic Tank");
var sensor1 = sensorFactory.getSensor(1);
sensor1.readTemperature(200);
sensor1.getTemperature(); //prints 200
sensor1.readTemperature(100); //prints 100
sensor1.getTemperature();
sensor1.readTemperature(10); //prints 10
sensor1.getTemperature();
console.log(JSON.stringify(sensor1))
实际输出:
{"sensorId":1,"sensorType":"DS18B20","sensorName":"Cryogenic Tank","temperature": 10}
我相信以下块中的温度 (A) 是一个私有变量,因此不应从对象外部访问它,但是当我运行 {{1 }}?
{"sensorId":1,"sensorName":"Cryogenic Tank"}
- 我对 JS 非常生疏。你能帮我理解我在概念上错误的地方吗?您将如何修改代码以使其按预期工作?
解决方法
这是对现代 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,name) {
this.set(id,new Sensor(id,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))
@Bergi 的第二条评论是我问题的解决方案。我也遵循了他的建议并删除了返回 sensorFactory 对象的 sensorFactory 函数。代码现在很清楚了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。