没有变量赋值或声明的Javascript属性访问:为什么?

没有变量赋值或声明的Javascript属性访问:为什么?,javascript,properties,singleton,prototypal-inheritance,Javascript,Properties,Singleton,Prototypal Inheritance,我继承了一个相当大的代码库,似乎有一些编码模式在进行,但我一辈子都看不到它的作用 从本质上讲,这个应用程序包含许多类,每个类都有一种工厂函数来强制执行单例。但是,似乎有一个冗余行只访问对象属性,而不将其分配给变量或设置属性 例如: myApp.dialog.AddEvent = Backbone.View.extend({ initialize: function() { ... }, render: function() { ... }, refresh: function() {

我继承了一个相当大的代码库,似乎有一些编码模式在进行,但我一辈子都看不到它的作用

从本质上讲,这个应用程序包含许多类,每个类都有一种工厂函数来强制执行单例。但是,似乎有一个冗余行只访问对象属性,而不将其分配给变量或设置属性

例如:

myApp.dialog.AddEvent = Backbone.View.extend({
  initialize: function() { ... },
  render: function() { ... },
  refresh: function() { ... }
});

myApp.dialog._addEvent; // <-- What is this for?

myApp.dialog.addEvent = function() {
  var d = myApp.dialog._addEvent;
  if (!d) {
    d = myApp.dialog._addEvent = new myApp.dialog.AddEvent();
  }
  return d;
}
myApp.dialog.AddEvent=Backbone.View.extend({
初始化:函数(){…},
render:function(){…},
刷新:函数(){…}
});
myApp.dialog.\u addEvent;// 这行代码:

myApp.dialog._addEvent;
什么都不做。它不会导致定义该属性,如果该属性不存在,也不会导致错误。事实上,
myApp.dialog
对象在该行之前或之后没有区别


正如您所猜测的,作者可能认为所讨论的行定义了对象上的属性(它没有定义),并且下面的代码不需要预定义对象上的属性。

如果没有查看
myApp.dialog的源代码。_addEvent
,就不可能确切地说出发生了什么。通常,包含正在访问的变量的单行将不起任何作用:

var a = {
    wat: 'wat'
};
a.wat; //this does nothing
但是,可能是为该属性编写了,这可能会导致副作用(或者您可能会看到,或者)

这种编程通常被认为是不好的做法,因为它违反了规则


也就是说,仅仅因为这是一种不好的做法并不意味着它不会发生。

你问的那句话没有任何作用。它不会导致定义该属性,如果该属性不存在,也不会导致错误。事实上,
myApp.dialog
对象在该行之前或之后没有区别。谢谢,是的,我就是这么想的。我认为这可能是一种错误的尝试,试图在没有赋值的情况下声明等价变量(例如,
var addEvent;
)。我认为您可以从下面的代码中看出,
\u addEvent
属性的预期数据是一个对象,而不是一个具有访问器的属性。@jfriend00,我同意这是非常可能的,然而,有可能用访问器和变异器做一些非常疯狂的事情,所以值得一提的是其他的可能性。是的,很荣幸你找到了这行“可能”在做的事情,但我不认为我们有任何证据表明这就是实际发生的事。啊,有趣!我甚至没有想到ES5访问器。但是,我已经搜索了整个代码库和
myApp.dialog.\u addEvent
在该类之外的任何地方都没有出现,所以它一定是一个多余的行。非常好,谢谢!现在我可以删除一堆代码,这是我最喜欢的消遣之一
var a = {
    get wat() {
        console.log('wat!');
        return 'wat';
    }
};
a.wat; //this writes 'wat!' to the console