最好的做法是使用这些吗?
var x = { a: 'a', eat: function() { }, ... }
VS
var x = function() { var a = 'a'; this.eat = function() { }}
以上需要启动:
new x();
有人可以帮助我解释这两者的重要性,哪一个是oop社区中的首选?任何智慧的话都会有所帮助。我也做了一些研究但没有出现。很多人都很感激。
答案 0 :(得分:4)
基本区别在于第一个版本公开变量'a',而第二个版本公开变量'a'。因此,除非您需要或需要客户端代码才能访问x.a
,否则首选第二个版本。
第三种方法是使用原型。在这种情况下,构造函数中的局部变量对你没有多大帮助,所以如果eat()
需要访问a
,那么你会写:
function x() {
this.a = 'a';
}
x.prototype.eat = function() {
// do stuff with this.a
}
在这种情况下,每个实例都有a
的新副本,但只有eat
的一个副本。缺点(如果您认为是这一点)是a
实例的用户可以使用x
。
答案 1 :(得分:3)
第一个只创建一个对象,不能将其与new
关键字一起使用。第二个包含局部变量a
,而不是像第一个那样创建属性。
函数通常写为命名函数,而不是分配给变量的匿名函数:
function x() {
this.a = 'a';
this.eat = function() {};
}
现在您可以使用它创建对象:
var y = new x();
为对象指定方法的另一种方法是将其放在原型中:
function x() {
this.a = 'a';
}
x.prototype.eat = function() {};
答案 2 :(得分:2)
一般来说,这取决于你想要得到什么。请记住,JS没有真正的类,它的基于原型的语言。运营商new
具有误导性。
我建议只要有可能就使用文字{}
。例如,你可以这样做:
var myconstr = function(param){
var pr = 'some private var';
return {
a : param,
get2a : function(){ return this.a; }
};
};
如果您只想要一个实例,则可以在定义后立即调用此函数。
但是如果你想使用prototype
,使用构造函数可能会更容易 - 但是,我仍然不会使用new运算符,也许将它包装在其他函数中会更好。