我正在学习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'关键字的内容,比如: 这个 来尝试自己回答这个问题,但不知为何,我觉得没有一个例子真正符合我上面描述的情况。
所以我拿到了源代码,想看看在做了上面的改动后,这个程序是否还能用。而它确实可以。我现在假设这两种方法是等同的:使用一种方法而不是另一种方法有什么好处吗?还是说这只是取决于每个开发者的编程风格?
在一般情况下,当你有。
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()
依次为: