3

我正在使用 websockets 在 JavaScript 中开发一个聊天室应用程序。然而,除了这里和那里的 jQuery 小片段外,我对 JavaScript 的经验很少。

我的问题是,我应该使用什么设计模式来使对象自包含并能够创建它的多个实例而不干扰同一对象的其他实例?此外,当“this”关键字引用当前对象实例以外的内容时,我需要知道如何存储公共对象属性并从事件处理程序中访问它们。

代码示例会很棒!

目前,我正在使用原型设计模式,它似乎工作但不是很优雅 - 至少可以说......特别是我如何处理事件,有没有更好的方法?

我目前正在做类似的事情:

function Room( args ) {
    this.container = $( '#room-' + args.id );
    this.container.find( '.someBtn' ).on( 'click', this.someEventHandler() );
}

Room.prototype.someEventHandler = function() {
    var self = this;

    return function( event ) {
        console.log( self, this, event );
    }
}

谢谢!

4

2 回答 2

1

原型已经足够好,它非常适合您描述的任务。

如果你想要更多,你就无法逃避阅读:-)那里有很多设计模式,有时更多的是偏好问题,因为差异很小。

这是关于模式的最佳读物之一:JS 设计模式

另一个关于模块模式和 requirejs:使用模块组织代码

于 2013-01-11T16:23:59.107 回答
0

我建议你不要把它留给 Room 来找出元素并使用 $.proxy

function Room( args ) {
    this.container = $( args.elem ); //elem can be selector, dom element, or another jQuery object
    this.container.find( '.someBtn' ).on( 'click', $.proxy( this.clicked, this) );
}

Room.prototype.clicked = function(event) {
    console.log( this, event.currentTarget );
}

clicked方法this中是房间实例 abd event.currentTarget是处理程序附加到的元素或委托目标。见http://api.jquery.com/event.currentTarget/

我对 jQuery 有一个待处理的功能请求,以使上述内容更加清晰http://bugs.jquery.com/ticket/12031

于 2013-01-11T16:22:47.063 回答