2015-03-19 64 views
0

原始的问题Javascript对象函数调用对象中的另一个功能,Rails的

想不通为什么我不能从第一函数中调用的第二功能。我正在使用jQuery-turbolinks。 (另外,如果你碰巧知道只在轨中运行页面特定的JavaScript的更好的方法,请告诉我。目前,这是我最好的实现,在这里我检查身体是否有特定的类,如果它确实运行,那么我运行这个JavaScript对象内的init函数)。

应用程序/资产/ Java脚本/ blogs.js

$(document).ready(function(){ 

    var blogsjs = { 
     myBlog: this, 
     init: function(){ 
      alert("hello from blogs"); 
      $("input").on('click', function(){ 
       $(this).hide('slow', function(){ 
        myBlog.another(); 
       }); 
      }); 
     }, 
     another: function(){ 
      alert("I was called!") 
     } 
    }; 


    if($('body').hasClass("blogs") == true){ 
     blogsjs.init(); 
    } 
}); 

解决方案之后从一个方法内反馈

只是简单地使用object.method()语法来调用同一对象中的另一种方法:

$(document).ready(function(){ 

    var blogsjs = { 
     init: function(){ 
      alert("hello from blogs"); 
      $("input").on('click', function(){ 
       $(this).hide('slow', function(){ 
        blogsjs.another(); 
       }); 
      }); 
     }, 
     another: function(){ 
      alert("I was called!"); 
      blogsjs.yetanother(); 
     }, 
     yetanother: function(){ 
      alert("yet another called"); 
     } 
    }; 
     blogsjs.init(); 

}); 

我不喜欢这段代码看起来有多混乱,但是我认为,面向对象设计的封装优势是可靠的:每个资源的javascript只能访问其javascript对象内的方法。

回答

1

我不知道你想与你的声明,这部分实现的目标:

var blogsjs = { 
    myBlog: this 
} 

但是,this将不会被设置为blogsjs。这将是上述功能中的任何内容。在Javascript中,this仅在函数调用中设置。它不是在Javascript字面声明中设置的,因此您不能静态声明引用该对象本身的属性。 JavaScript只是不支持。

如果需要,可以在构造包含对象引用的对象后添加属性。

如果你想myBlog被初始化为指向blogsjs,那么你将不得不这样做定义对象后:

var blogsjs = { 
    init: function() {...}, 
    another: function() {...} 
}; 
blogsjs.myBlog = blogsjs; 

此外,该行代码将无法正常工作:

myBlog.another(); 

myBlog因为是一个对象,而不是可变的属性。它必须与其父对象一起引用。

1

因此,您可能会遇到Cannot read property 'another' of undefined异常,因为您在blogsjs对象上指定了myBlog,但未引用该对象。另外myBlog不是是blogsjs的引用,但范围jquery调用document.ready函数。

你需要或者创建init方法内部参考:

init: function(){ 
    var myBlog = this; 
    alert("hello from blogs"); 
    $("input").on('click', function(){ 
    $(this).hide('slow', function(){ 
     myBlog.another(); 
    }); 
    }); 
} 

或者干脆使用blogsjs从一个范围以上的init方法。

Have a look at this question to learn about scoping.

相关问题