【问题标题】:Better way to access variables across prototype methods in JavaScript?在 JavaScript 中跨原型方法访问变量的更好方法?
【发布时间】:2015-02-20 01:10:01
【问题描述】:

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

这种模式真正困扰我的一件事是,为了使变量可以在所有原型方法中访问,我必须在构造函数中的每个变量前面添加“this”。这是一个很大的痛苦,我不禁想到有一种更优雅的方式来做到这一点。

如果我放弃使用原型对象而只是将方法添加为实例方法,我知道我无法解决这个问题,但我喜欢效率吗?和这种模式的自我封装性质。对于更好的模式还有其他建议吗?谢谢!

【问题讨论】:

  • 请查看我的编辑,因为它们遵循 JavaScript 最佳实践。请大写您的构造函数。
  • 另外,不要用另一个对象替换原型,你最终会覆盖需要保留的东西。

标签: javascript prototype


【解决方案1】:

这是一个很大的痛苦

不,真的不是。每个 JavaScript 开发人员都使用这种语法。如果你在 Ruby 或 Python 中,你会使用 self.,在 PHP 中你会使用 $this->。像 C++ 这样的一些语言不需要任何特殊的装饰器,但 JavaScript 需要。

我不禁想到有一种更优雅的方式来做到这一点。

不,没有。

这是 JavaScript 的语法,您无法更改它,也无法解决它。如果要访问this 的属性,则需要在属性名称前加上this.。否则,您说的是全局变量。

如果您想要不同的语法,请考虑使用不同的语言,例如 CoffeeScript,它可以编译为 JavaScript。

【讨论】:

  • 我完全同意。在访问对象的属性之前,写this 真的不是一件痛苦的事。每种 OOP 语言都遵循此规则来引用对象方法或属性,无论是 self.this.parent::,还是保存对象的变量的名称。
【解决方案2】:

如果您谈论的是访问公共实例属性或方法,meager 已经总结了很多事情。你必须在它前面使用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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多