Javascript 正在使用错误属性调用的对象
我目前正在建立一个类似于PCPartPicker的网站,但用于学校项目的水冷部件。我介入了,我遇到了一些问题。最重要的是: 这是我的对象构造函数开始Javascript 正在使用错误属性调用的对象,javascript,jquery,html,Javascript,Jquery,Html,我目前正在建立一个类似于PCPartPicker的网站,但用于学校项目的水冷部件。我介入了,我遇到了一些问题。最重要的是: 这是我的对象构造函数开始 var cpuCollection = []; var myComputer = []; function CPU(frequency,cores,socket,name) { this.name = name; this.frequency = frequency; this.cores = cores; this
var cpuCollection = [];
var myComputer = [];
function CPU(frequency,cores,socket,name) {
this.name = name;
this.frequency = frequency;
this.cores = cores;
this.socket = socket;
cpuCollection.push(this);
}
var i75930k = new CPU(3.6, 6, 2011.3, "i7 5930k");
var i54690k = new CPU(3.6, 4, 1150, "i5 4960k");`
在我构建了对象构造函数之后,我使用真实的计算机部件制作了一些测试对象
在我的HTML中,我有下拉菜单,这些菜单由使用以下代码加载的对象填充:
$(cpuCollection).each(function() {
$('#cpusel').append($("<option> " + this.name + "</option>"))
});
不幸的是,此代码当前不起作用,它告诉我当选择了i75930k
时,myCPU.socket
是1150
,而实际上应该是2011.3
。我在这里已经智穷到极点了,我想取得一些进展。
提前谢谢你的帮助
编辑:我修复了等号问题,现在我认为问题可能源于我将对象推入cpuCollection数组的方式。当我尝试记录cpuCollection时,我得到了[CPU,CPU],这显然不是我想要的。如何将创建时的CPU对象推送到cpuCollection中,使其所有属性保持不变。在if()语句中尝试以下操作:
$('#cpusel').change(function() {
myCPU = new CPU();
$(cpuCollection).each(function(){
if(this.name === $('#cpusel :selected').text()) {
myCPU = this;
}
});
因此,您的一些逻辑/语法存在一些问题,我将尝试单独解决这些问题,以便您更好地理解我是如何得到一个有效的解决方案的: 1) 将元素从对象定义内部推送到数组中。这通常是一种不好的做法,因为它是不可重用的,如果在实例化CPU对象实例之前未定义名为
cpuCollection
的数组,则会引发错误。最好说cpuCollection.push(新CPU(…)代码>
2) 将选项附加到下拉列表时,还应添加value
属性,以便更轻松地获取#3中的值
3) 如果在
元素上设置value属性,则无需查找所选选项的文本,可以将选择器简化为$('#cpusel').val()
4) 没有必要通过说$(cpuCollection)将数组包装到jQuery对象中。每个(…)
,您都可以(也应该)使用内置的vanilla javascript数组操作
5) 我将更改处理程序中的.each()
更改为.some()
这是因为当您从.some()
返回true时,它会停止任何进一步的迭代,这正是您想要的。以前,它将继续循环到最后,即使它已经找到了匹配的CPU
6) 我添加了一个myCPU变量并将其实例化为null,因此如果您在严格模式下运行,您的更改处理程序不会因为之前未定义的变量而引发错误
7) if语句中的逻辑是执行赋值,而不是比较,因为使用了=
而不是==或===
,这是一个简单的错误
希望这有帮助
var cpuCollection=[];
var myComputer=[];
var myCPU=null;
功能CPU(频率、核心、插座、名称){
this.name=名称;
这个频率=频率;
这是。核心=核心;
this.socket=socket;
}
cpuCollection.push(新的CPU(3.6,6,2011.3,“I75930K”);
push(新的CPU(3.6,41150,“i5 4960k”);
forEach(函数(cpu,索引){
$('#cpusel')。追加($(''+cpu.name+'')
});
$('#cpusel').change(function(){
myCPU=新CPU();
cpuCollection.some(函数(cpu、索引){
if(cpu.name==$('#cpusel').val()){
myCPU=cpu;
返回true;
}
});
console.log(myCPU);
});代码>
有一个简单的方法:
var cpuCollection=[];
var myComputer=[];
功能CPU(频率、核心、插座、名称){
cpuCollection.push({
姓名:姓名,,
频率:频率,,
核心:核心,
插座:插座
});
}
var i75930k=CPU(3.6,6,2011.3,“i7 5930k”);
变量i54690k=CPU(3.6,41150,“i5 4960k”);
$(cpuCollection)。每个(函数(i,cpu){
var option=$('').html(cpu.name).data('cpu',cpu);
$('#cpusel')。附加(可选);
});
$('#cpusel').change(function(){
var selected=$(this.find('option:selected');
var text=$(选定).text();
var-myCPU;
//您可以简单地使用:myCPU=$(已选择).data(“cpu”)
console.log('via data:',$(已选).data(“cpu”);
$(cpuCollection)。每个(函数(i,cpu){
if($.trim(cpu.name)==$.trim(text)){
myCPU=cpu;
//返回false;=>断开each();
}
});
log('via each:',myCPU);
});
看看这个。你的意思是this.name==
而不是this.name=
。查看我的解决方案-应该有助于理解如何修复和优化代码。如果您有任何问题,请告诉我谢谢帮助Rowan,不幸的是,我现在收到一个错误,指出myCPU未定义。让我快速进行一些调试。哦,是的,试试“var myCPU”
$('#cpusel').change(function() {
myCPU = new CPU();
$(cpuCollection).each(function(){
if(this.name === $('#cpusel :selected').text()) {
myCPU = this;
}
});
var cpuCollection = [];
var myComputer = [];
function CPU(frequency,cores,socket,name) {
cpuCollection.push({
name: name,
frequency: frequency,
cores: cores,
socket: socket
});
}
var i75930k = CPU(3.6, 6, 2011.3, "i7 5930k");
var i54690k = CPU(3.6, 4, 1150, "i5 4960k");
$(cpuCollection).each(function(i,cpu) {
var option = $('<option/>').html(cpu.name).data('cpu',cpu);
$('#cpusel').append(option);
});
$('#cpusel').change(function() {
var selected = $(this).find('option:selected');
var text = $(selected).text();
var myCPU;
// You can simply use : myCPU = $(selected).data("cpu")
console.log('via data:',$(selected).data("cpu"));
$(cpuCollection).each(function(i,cpu){
if($.trim(cpu.name) == $.trim(text)) {
myCPU = cpu;
// return false; ==> break the each();
}
});
console.log('via each:',myCPU);
});