Javascript 如何从类构造函数访问模型
我刚刚开始使用OOJavaScript,我正在努力重新格式化一些现有代码以使用OOJS,但是我遇到了一个问题,我希望你们这些杰出的人能帮助我解决这个问题。在下面的代码中,我试图从Nav对象的构造函数内部调用scroll函数,但是当我运行此代码时,我得到一个错误,即this.scroll不是一个函数。我可以更改什么以允许构造函数使用对象的方法 根据以下评论和答案,于下午3:20更新代码。我仍然有同样的问题_self.scroll不是一个函数 更新日期:2/18,太平洋时间下午6:00 我已经将我的代码更新为以下内容,现在可以使用了。然而,我很好奇,使用我以前使用的objectliteral方法和现在使用的构造函数方法之间有什么区别 从我所能收集到的信息来看,这是有效的,因为在调用scroll方法之前,我已经定义了它;其中,与之前一样,我在构造函数中调用它,因为它是在返回中创建的。但是,我不确定这个更改对性能的影响,以及使用文本构造函数是否更好Javascript 如何从类构造函数访问模型,javascript,Javascript,我刚刚开始使用OOJavaScript,我正在努力重新格式化一些现有代码以使用OOJS,但是我遇到了一个问题,我希望你们这些杰出的人能帮助我解决这个问题。在下面的代码中,我试图从Nav对象的构造函数内部调用scroll函数,但是当我运行此代码时,我得到一个错误,即this.scroll不是一个函数。我可以更改什么以允许构造函数使用对象的方法 根据以下评论和答案,于下午3:20更新代码。我仍然有同样的问题_self.scroll不是一个函数 更新日期:2/18,太平洋时间下午6:00 我已经将我的
//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);