最好的做法是什么使用这些?Javascript字面与功能oop
var x = { a: 'a', eat: function() { }, ... }
VS
var x = function() { var a = 'a'; this.eat = function() { }}
上述需要启动:
new x();
有人可以帮我解释一下两者的重要性,哪一个是最好的空中接力社区内选择?任何智慧的话都会有所帮助。我也做了一些研究,但没有出现。非常感激。
最好的做法是什么使用这些?Javascript字面与功能oop
var x = { a: 'a', eat: function() { }, ... }
VS
var x = function() { var a = 'a'; this.eat = function() { }}
上述需要启动:
new x();
有人可以帮我解释一下两者的重要性,哪一个是最好的空中接力社区内选择?任何智慧的话都会有所帮助。我也做了一些研究,但没有出现。非常感激。
基本的区别在于第一个版本公开变量'a',而第二个版本隐藏它。因此,除非您想要或需要客户端代码才能访问x.a
,否则第二个版本是首选。
第三种方法是使用原型。在这种情况下,在构造函数中的局部变量不会做你多好,所以如果eat()
需要访问a
,那么你会写:
function x() {
this.a = 'a';
}
x.prototype.eat = function() {
// do stuff with this.a
}
在这种情况下,每个实例有一个新副本a
,但只有eat
的一个副本。缺点(如果你认为它是)a
可用于x
实例的用户。
第一个只创建一个对象,不能与new
关键字一起使用。第二个包含一个局部变量a
而不是像第一个那样创建一个属性。
功能常常被当成命名函数来代替匿名函数赋值给变量:
function x() {
this.a = 'a';
this.eat = function() {};
}
现在你可以使用它创建对象:
var y = new x();
为对象的指定方法的另一种方式是把它放在原型中:
function x() {
this.a = 'a';
}
x.prototype.eat = function() {};
实际上,“分配给变量的匿名函数”被称为函数表达式,并且相当常见。 –
@Bradley Staples:不,*函数表达式*不是赋给变量*的* anonymus函数,匿名函数是函数表达式的一种形式,所以赋给变量*的*匿名函数是一种形式的*分配给变量*的函数表达式。虽然这很常见,但命名函数更常见。 – Guffa
通常它d依靠你想要得到的东西。请记住,JS没有真正的类,它的基于原型的语言。运营商new
颇具误导性。
我会建议使用文字{}
只要有可能。在例子中,你可以做这样的:
var myconstr = function(param){
var pr = 'some private var';
return {
a : param,
get2a : function(){ return this.a; }
};
};
如果你想只有一个实例,你总是可以只定义后调用这个函数。
但是如果你想使用prototype
,使用构造函数可能会更容易 - 但是,我仍然不会使用new运算符,也许用其他函数包装它会更好。
但是,第二个版本不允许使用[[prototype]](其中第一个*可以被平凡地转换成) - 第二个方法每个'eat'都会因此成为一个新的函数对象与一个新的界限[[范围链]]。我通常更喜欢使用[[prototype]]。 – 2011-08-05 06:54:18
是的,但他总是可以做 'var x =(function(){var a ='a'; return {eat:function(){}};}());' –
你可以举一个例子原型会是什么样子? –