Javascript-遍历数组值无效-TypeError:DealsController.prototype.a未定义

Javascript-遍历数组值无效-TypeError:DealsController.prototype.a未定义,javascript,arrays,Javascript,Arrays,我试图使下面的代码不仅适用于DealsController.prototype。showcase而且也适用于DealsController.prototype。anothermethod2和anothermethod3 ans等等……每次都不重复代码。我正在尝试使用一个循环 下面是我想用循环重构的代码: deal.js 我尝试了这里介绍的各种方法,但我得到了以下错误,例如: deal.js var DealsController = Paloma.controller('Deals'); v

我试图使下面的代码不仅适用于DealsController.prototype。showcase而且也适用于DealsController.prototype。anothermethod2anothermethod3 ans等等……每次都不重复代码。我正在尝试使用一个循环

下面是我想用循环重构的代码: deal.js

我尝试了这里介绍的各种方法,但我得到了以下错误,例如:

deal.js

var DealsController = Paloma.controller('Deals');

var index;
var a = ["showcase", "method2", "method3"];
for (index = 0; index < a.length; ++index) {
    console.log(a[index]);

DealsController.prototype.a[index] = function () {



      /* NEW USER ONBOARDING**************************************************
       */ 

      // display basic rule of how the app works then make it disappear after 3 seconds
      $(window).load(function(){
        if ($.cookie("onboarding_modal_shownNX") == null) {
          $.cookie('onboarding_modal_shownNX', 'yes', { expires: 720, path: '/' }); // only show onboading modal once per device
          $('#onboardingModal').modal('show');    
          $('#onboardingModal').fadeTo(3000, 500).slideUp(500, function(){
            $(this).remove(); 
          });
        }
      });  

    };

上面来自Teemu的评论显示了您的错误做法。但是如果它们都要调用相同的精确函数,那么简单地将相同的函数分配给所有三个属性就更简单了

DealsController.prototype.showcase =
DealsController.prototype.method2 =
DealsController.prototype.method3 = function() {
  $(window).load(function(){
    if ($.cookie("onboarding_modal_shownNX") == null) {
      $.cookie('onboarding_modal_shownNX', 'yes', { expires: 720, path: '/' }); // only show onboading modal once per device
      $('#onboardingModal').modal('show');    
      $('#onboardingModal').fadeTo(3000, 500).slideUp(500, function(){
        $(this).remove(); 
      });
    }
  });  
};
或者,如果要使用循环,请首先创建函数,然后在循环中分配它

function sharedFunc() {
  $(window).load(function(){
    if ($.cookie("onboarding_modal_shownNX") == null) {
      $.cookie('onboarding_modal_shownNX', 'yes', { expires: 720, path: '/' }); // only show onboading modal once per device
      $('#onboardingModal').modal('show');    
      $('#onboardingModal').fadeTo(3000, 500).slideUp(500, function(){
        $(this).remove(); 
      });
    }
  });  
};

var index;
var a = ["showcase", "method2", "method3"];
var name;
for (index = 0; index < a.length; ++index) {
  name = a[index];
  DealsController.prototype[name] = sharedFunc;
}
函数sharedFunc(){
$(窗口)。加载(函数(){
if($.cookie(“入职模式”\u shownNX”)==null){
$.cookie('onboarding_modal_shownNX','yes',{expires:720,path:'/'});//每个设备只显示一次onboading modal
$('#onboardingmodel').model('show');
$(“#onboardingModal”).fadeTo(3000500).slideUp(500,function(){
$(this.remove();
});
}
});  
};
var指数;
变量a=[“showcase”、“method2”、“method3”];
变量名;
对于(索引=0;索引
DealsController(在第一行)是一个打字错误吗?是的,抱歉,请更正。您必须使用括号符号根据
a
中的值命名属性,即
DealsController.prototype[a[index]=…
。如果不想重复代码,您是否有理由不将它移出到自己的函数中,并从
DealsController.prototype
方法调用它?我想一定有什么东西能把他们区分开来,对吧?我不确定我能理解你们。我只想让js块“重复它自己”,就像我写了3倍于块的唯一区别是第一行:DealsController.prototype.method1,DealsController.prototype.anothermethod,DealsController.prototype.anothermethod…看起来很简单。能做到吗?那么为什么人们经常使用for..in或freach循环来实现这个功能呢?@Mathieu:在
.prototype
上共享完全相同的功能是不寻常的。在某些情况下,每个版本都需要引用一个唯一的、限定范围的变量。在这种情况下,需要使用
.forEach()
或同时调用另一个函数来创建闭包的常规循环。好的,谢谢,我将使用您的第一个解决方案。我一心想找到一个循环的方法。但在这个过程中,我还是学到了一些关于循环的知识。谢谢
DealsController.prototype.showcase =
DealsController.prototype.method2 =
DealsController.prototype.method3 = function() {
  $(window).load(function(){
    if ($.cookie("onboarding_modal_shownNX") == null) {
      $.cookie('onboarding_modal_shownNX', 'yes', { expires: 720, path: '/' }); // only show onboading modal once per device
      $('#onboardingModal').modal('show');    
      $('#onboardingModal').fadeTo(3000, 500).slideUp(500, function(){
        $(this).remove(); 
      });
    }
  });  
};
function sharedFunc() {
  $(window).load(function(){
    if ($.cookie("onboarding_modal_shownNX") == null) {
      $.cookie('onboarding_modal_shownNX', 'yes', { expires: 720, path: '/' }); // only show onboading modal once per device
      $('#onboardingModal').modal('show');    
      $('#onboardingModal').fadeTo(3000, 500).slideUp(500, function(){
        $(this).remove(); 
      });
    }
  });  
};

var index;
var a = ["showcase", "method2", "method3"];
var name;
for (index = 0; index < a.length; ++index) {
  name = a[index];
  DealsController.prototype[name] = sharedFunc;
}