Javascript 如何从类构造函数访问模型

Javascript 如何从类构造函数访问模型,javascript,Javascript,我刚刚开始使用OOJavaScript,我正在努力重新格式化一些现有代码以使用OOJS,但是我遇到了一个问题,我希望你们这些杰出的人能帮助我解决这个问题。在下面的代码中,我试图从Nav对象的构造函数内部调用scroll函数,但是当我运行此代码时,我得到一个错误,即this.scroll不是一个函数。我可以更改什么以允许构造函数使用对象的方法 根据以下评论和答案,于下午3:20更新代码。我仍然有同样的问题_self.scroll不是一个函数 更新日期:2/18,太平洋时间下午6:00 我已经将我的

我刚刚开始使用OOJavaScript,我正在努力重新格式化一些现有代码以使用OOJS,但是我遇到了一个问题,我希望你们这些杰出的人能帮助我解决这个问题。在下面的代码中,我试图从Nav对象的构造函数内部调用scroll函数,但是当我运行此代码时,我得到一个错误,即this.scroll不是一个函数。我可以更改什么以允许构造函数使用对象的方法

根据以下评论和答案,于下午3:20更新代码。我仍然有同样的问题_self.scroll不是一个函数

更新日期:2/18,太平洋时间下午6:00

我已经将我的代码更新为以下内容,现在可以使用了。然而,我很好奇,使用我以前使用的objectliteral方法和现在使用的构造函数方法之间有什么区别

从我所能收集到的信息来看,这是有效的,因为在调用scroll方法之前,我已经定义了它;其中,与之前一样,我在构造函数中调用它,因为它是在返回中创建的。但是,我不确定这个更改对性能的影响,以及使用文本构造函数是否更好

//Define Nav class
function Nav(d){
    var _self = this;

    //Define scroll method
    Nav.prototype.scroll = function(e, dist){
        $.scrollTo($("#" + e.data('href')), 1000, {offset: dist});
    };

    $('nav a').click(function(){
        var offset = -110;
        if(d.mobile()){ 
            offset = 0; 
        }
        _self.scroll($(this), offset);
    });
}
在单击处理程序中使用此选项时,实际上是指$'nav a',而不是nav对象

我使用以下语法将Nav设置为变量,并让事件侦听器引用该变量

var Nav = (function (d){
    return{
        //Define scroll method
        scroll : function(e, dist){
            $.scrollTo($("#" + e.data('href')), 1000, {offset: dist});
        }
    };
})(device);


$('nav a').click(function(){
    var offset = -110;
    if(d.mobile()){ 
        offset = 0; 
    }
    Nav.scroll($(this), offset);
});

一直以来,真正的问题是,这是一个不适合涉及原型链的场景

当对象将被多次实例化时,您应该只注意向原型添加方法

只需定义一个单例:


我对$this和$this的混合感到困惑。我同意,更好的命名约定会有很大帮助,可能会将$this更改为anchor或elem,因为您正在使用它来引用anchor元素。我已经更新了上面的命名约定。它之所以有效,是因为_self=Nav具有滚动功能。以前您有_self=Nav,但函数scroll属于您要返回的新对象。我已使用此建议更新了我的代码,上面也进行了更新,但我仍然收到相同的错误。而不是返回技术上甚至不是Nav实例的新对象,您应该在实例上创建一个属性,该属性调用相应的prototype属性。更改了我的示例以更好地适合您的语法。还从nav函数中删除了事件侦听器,该函数感觉更干净,并防止可能添加多个事件侦听器。这是一个非常理想的解决方案。注意jQuery的事件委派的升级。在singleton之后包含设备的目的是什么?@user3325478:oops,我的意思是将其添加为Nav构造函数参数。。编辑:@user3325478:这是多余的-在本例中,它只是将设备简写为d-因为询问者的代码就是这样编写的。
var Nav = (function (d){
    return{
        //Define scroll method
        scroll : function(e, dist){
            $.scrollTo($("#" + e.data('href')), 1000, {offset: dist});
        }
    };
})(device);


$('nav a').click(function(){
    var offset = -110;
    if(d.mobile()){ 
        offset = 0; 
    }
    Nav.scroll($(this), offset);
});
var nav = new function Nav(d){
  var nav=this;

  nav.scroll = function(e,dist){ 
    $.scrollTo($("#" + e.data('href')), 1000, {offset: dist});
  };

  $('nav').on('click','a',function(jqEvent){ // Event Delegation
    var $navLink = $(this);
    var offset = -110;
    if (d.mobile()) offset = 0; 
    nav.scroll( $navLink, offset );
  });
}(device);