在下面的代码中用JavaScript实现工厂模式的正确方法
下面的代码应该是为涉及Arduino的项目提取一个温度传感器 我有表示硬件传感器的传感器函数、创建传感器实例的传感器工厂函数和存储/返回阵列中传感器对象的saveSensor/findSensor函数在下面的代码中用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
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(温度);}
}
返回传感器;
};
下面是对现代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;
};