Javascript-遍历数组值无效-TypeError:DealsController.prototype.a未定义
我试图使下面的代码不仅适用于DealsController.prototype。showcase而且也适用于DealsController.prototype。anothermethod2和anothermethod3 ans等等……每次都不重复代码。我正在尝试使用一个循环 下面是我想用循环重构的代码: deal.js 我尝试了这里介绍的各种方法,但我得到了以下错误,例如: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
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;
}