我经常使用主JavaScript构造函数的模式并将方法添加到其原型对象中,以便用户可以直观地调用它们,例如:
function Slideshow(options) {
this.options = options
this.slideshow = $('#slideshow')
//more variables here
}
Slideshow.method1 = function () {
this.slideshow.addClass('test') // do something with slideshow variable
};
Slideshow.method2 = function () {
// another method
};
关于这种模式真正让我烦恼的一件事是,为了使变量可以在所有原型方法中访问,我必须添加"这个"在构造函数内的每个变量前面。这是一个很大的痛苦,我无法帮助,但认为这是一种更优雅的方式。
如果我放弃使用原型对象并只添加方法作为实例方法,我知道我无法解决这个问题,但我喜欢效率?并且自我封装了这种模式的本质。有关更好模式的任何其他建议吗?谢谢!
答案 0 :(得分:3)
这是一次重大的痛苦
不,它真的不是。每个JavaScript开发人员都使用此语法。如果您使用的是Ruby或Python,则可以使用self.
,在PHP中使用$this->
。像C ++这样的语言不需要任何特殊的装饰器,但JavaScript会这样做。
我无法帮助,但我认为这样做的方式更为优雅。
不,没有。
这是JavaScript的语法,您无法更改它,也无法解决它。如果要访问this
的属性,则需要在属性名称前this.
。否则,你在谈论全局变量。
如果您需要不同的语法,请考虑使用其他语言,例如CoffeeScript,它会编译为JavaScript。
答案 1 :(得分:0)
this
作为语言的工作方式。
但是,如果您有私有实例属性或方法,则可以在构造函数中将它们定义为局部变量,并且可以在不使用this
的情况下访问它们。
function slideshow(options) {
// no need to resave the options arguments as they can be used
// directly from the argument variable
// define a per-instance private variable that other methods defined
// within the constructor can use directly without the use of `this`
var theShow = $(options.selector || '#slideshow');
// define public methods
this.method1 = function() {
// can access private instance variable here without this in front of it
theShow.addClass('test');
}
this.method2 = function() {
theShow.addClass(options.decoaration);
}
}
此常规设计模式在此处描述:http://javascript.crockford.com/private.html
实际上,这是有效的,因为带有在其中声明的公共方法的构造函数创建了一个持续了对象生存期的闭包,因此构造函数中的局部变量变为每个实例变量只能从内部声明的函数访问构造函数。