没有变量赋值或声明的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