2011-08-05 114 views
5

最好的做法是什么使用这些?Javascript字面与功能oop

var x = { a: 'a', eat: function() { }, ... } 

VS

var x = function() { var a = 'a'; this.eat = function() { }} 

上述需要启动:

new x(); 

有人可以帮我解释一下两者的重要性,哪一个是最好的空中接力社区内选择?任何智慧的话都会有所帮助。我也做了一些研究,但没有出现。非常感激。

回答

4

基本的区别在于第一个版本公开变量'a',而第二个版本隐藏它。因此,除非您想要或需要客户端代码才能访问x.a,否则第二个版本是首选。

第三种方法是使用原型。在这种情况下,在构造函数中的局部变量不会做你多好,所以如果eat()需要访问a,那么你会写:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() { 
    // do stuff with this.a 
} 

在这种情况下,每个实例有一个新副本a,但只有eat的一个副本。缺点(如果你认为它是)a可用于x实例的用户。

+0

但是,第二个版本不允许使用[[prototype]](其中第一个*可以被平凡地转换成) - 第二个方法每个'eat'都会因此成为一个新的函数对象与一个新的界限[[范围链]]。我通常更喜欢使用[[prototype]]。 – 2011-08-05 06:54:18

+0

是的,但他总是可以做 'var x =(function(){var a ='a'; return {eat:function(){}};}());' –

+0

你可以举一个例子原型会是什么样子? –

3

第一个只创建一个对象,不能与new关键字一起使用。第二个包含一个局部变量a而不是像第一个那样创建一个属性。

功能常常被当成命名函数来代替匿名函数赋值给变量:

function x() { 
    this.a = 'a'; 
    this.eat = function() {}; 
} 

现在你可以使用它创建对象:

var y = new x(); 

为对象的指定方法的另一种方式是把它放在原型中:

function x() { 
    this.a = 'a'; 
} 

x.prototype.eat = function() {}; 
+0

实际上,“分配给变量的匿名函数”被称为函数表达式,并且相当常见。 –

+0

@Bradley Staples:不,*函数表达式*不是赋给变量*的* anonymus函数,匿名函数是函数表达式的一种形式,所以赋给变量*的*匿名函数是一种形式的*分配给变量*的函数表达式。虽然这很常见,但命名函数更常见。 – Guffa

2

通常它d依靠你想要得到的东西。请记住,JS没有真正的类,它的基于原型的语言。运营商new颇具误导性。

我会建议使用文字{}只要有可能。在例子中,你可以做这样的:

var myconstr = function(param){ 
    var pr = 'some private var'; 
    return { 
     a : param, 
     get2a : function(){ return this.a; } 
    }; 
}; 

如果你想只有一个实例,你总是可以只定义后调用这个函数。

但是如果你想使用prototype,使用构造函数可能会更容易 - 但是,我仍然不会使用new运算符,也许用其他函数包装它会更好。