在JavaScript中使用原型方法访问变量的更好方法是什么?

时间:2015-02-20 01:10:02

标签: javascript prototype

我经常使用主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
};

关于这种模式真正让我烦恼的一件事是,为了使变量可以在所有原型方法中访问,我必须添加"这个"在构造函数内的每个变量前面。这是一个很大的痛苦,我无法帮助,但认为这是一种更优雅的方式。

如果我放弃使用原型对象并只添加方法作为实例方法,我知道我无法解决这个问题,但我喜欢效率?并且自我封装了这种模式的本质。有关更好模式的任何其他建议吗?谢谢!

2 个答案:

答案 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

实际上,这是有效的,因为带有在其中声明的公共方法的构造函数创建了一个持续了对象生存期的闭包,因此构造函数中的局部变量变为每个实例变量只能从内部声明的函数访问构造函数。