如果对象方法嵌套在另一个对象实例中,如何访问它?

时间:2015-05-26 17:52:53

标签: javascript meteor

我使用了一个名为AnimOnScroll的库,我在我的页面加载实例化如下:

    new AnimOnScroll( this.find('#grid' ), {
        minDuration : 0.4,
        maxDuration : 0.7,
        viewportFactor : 0.2
    } );

如代码所示,AnimOnScroll对象实例附加到div,内容为#grid

在AnimOnScroll javascript文件中,在构造函数中调用了另一个库(masonry)(我删除了选项部分以使其在此处阅读简单):

function AnimOnScroll( el, options ) {  
    this.el = el;
    this._init();
}
AnimOnScroll.prototype = {

    _init : function() {


        var self = this;

        imagesLoaded( this.el, function() {

            // initialize masonry
            new Masonry( self.el, {
                itemSelector: 'li',
                transitionDuration : 0
            } );

我想访问砌体方法,但我无法找到如何在AnimOnScroll中访问其对象实例。

我设法通过每次重新创建AnimOnScroll的新实例来重新加载项目,但我想学习如何在这种情况下干净地完成它(仍然是javascript的新手)。

感谢您的帮助!

修改

我再试一次测试@Nick L.的答案。事实证明,如果我使用self.prototype.masonry = new Masonry( ...,我会收到错误:

Uncaught TypeError: Cannot set property 'masonry' of undefined

如果我用self.masonry = new Masonry( ...替换此行,它可以正常工作。我可以在控制台上显示AnimOnLoad对象,其中砌成了enter image description here

按照命名变量的方式,我通过记录scroll得到了这个。如果我尝试记录masonry(即scroll.masonry),则会显示为undefined

有什么想法吗?

编辑2

在AnimOnScroll的实例化中查看回调日志时,我意识到在渲染页面后创建了对象。这是我的第一个错误,试图在它没有加载时调用它。

我的第二个错误是假设我可以使用没有显示问题的砌体方法。该对象(AnimOnScoll)附加了一个"显示的"每个对象的类来处理转换并跟踪滚动位置。

我必须为每个需要使用的砌体方法重写一个方法。底线:我将选择阻力较小的路径,每次需要刷新时重新创建AnimOnScroll对象实例。这很好。对于那些感兴趣的人,我使用提供显示项集合的帮助器。就在它返回之前,我补充道:

Meteor.setTimeout(function(){
    if(typeof scroller!=undefined){scroller= new AnimOnScroll(.......)}
                  },100);

这样,AnimOnScroll在我的页面更新后立即重新加载并且运行顺畅。

我会验证你的答案,@ Nick L.因为你很高兴帮助我: - )

1 个答案:

答案 0 :(得分:2)

为了访问对象方法,您需要以某种方式以某种方式访问​​对象本身。

我建议你使用Masonry在对象上添加一个包含self实例的masonry属性,然后在那里传递构造的对象:

//Warning: Untested code


AnimOnScroll.prototype = {

    _init : function() {

        var self = this;

        imagesLoaded( this.el, function() {

        // initialize masonry
        self.masonry = new Masonry( self.el, {
            itemSelector: 'li',
            transitionDuration : 0
        } );
    }
}

然后,通过执行以下操作访问Masonry对象:

var scroll  = new AnimOnScroll();
var masonry = scroll.masonry;
//etc

编辑:考虑使用调试器或console.log多次检查,无论是否调用该对象,从调用其构造函数到调用它的位置开始,按顺序调用确保其正确的构造和使用。