在JavaScript的对象方法中使用'this'[关闭]。

问题描述 投票:0回答:1

我正在学习JavaScript,为了提高我的语言知识,我一直在试图了解这个问题是如何解决的。待办事项清单应用 工作。源代码是 在这里.

总的来说,我觉得我对代码的理解还不错。只有一件事困扰着我:在'App'对象的'init'方法的第43行,发生了以下情况。

this.todos = util.store('todos-jquery');

为了给你提供上下文,这里是App对象和init方法的开始。

var App = {
    init: function () {
        this.todos = util.store('todos-jquery');    // <= this line
        this.todoTemplate = Handlebars.compile($('#todo-template').html());
        this.footerTemplate = Handlebars.compile($('#footer-template').html());
        this.bindEvents();
        ...
    },
    ...
}

我不明白的是,为什么你要在init方法中使用 "this.todos "来定义 "todos",而不是像我下面做的那样,直接把它放到 "App "对象中。

var App = {
    todos: util.store('todos-jquery'),  // <= this line
    init: function () {
        this.todoTemplate = Handlebars.compile($('#todo-template').html());
        this.footerTemplate = Handlebars.compile($('#footer-template').html());
        this.bindEvents();
        ...
    }
...
}

我在MDN网络文档和其他文章中读到过关于'this'关键字的内容,比如: 这个 来尝试自己回答这个问题,但不知为何,我觉得没有一个例子真正符合我上面描述的情况。

所以我拿到了源代码,想看看在做了上面的改动后,这个程序是否还能用。而它确实可以。我现在假设这两种方法是等同的:使用一种方法而不是另一种方法有什么好处吗?还是说这只是取决于每个开发者的编程风格?

javascript this javascript-objects
1个回答
1
投票

在一般情况下,当你有。

var X = {
  y: z(),
  init: function() {
  }
};

这应该相当于:

var X = {
  init: function() {
    this.y = z();
  }
}

只要你调用 X.init() 并放心地打电话 z() 在此之前是没有问题的。最终的结果是 X.y 的返回值填充了 z().

第二种方法,一切都在 init()从一致性和简单性的角度来看,您可以对排序进行更多的控制,并且可能更可取。在这种特殊情况下,它确实显得很随意。

在现代JavaScript中,你真的应该有。

class X {
  constructor() {
  }

  y = z();
}

然后你就可以调用 let x = new X()x.y() 依次为:

© www.soinside.com 2019 - 2024. All rights reserved.