Javascript文字与功能oop

时间:2011-08-05 06:48:26

标签: javascript oop literals prototype-programming

最好的做法是使用这些吗?

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

VS

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

以上需要启动:

new x();

有人可以帮助我解释这两者的重要性,哪一个是oop社区中的首选?任何智慧的话都会有所帮助。我也做了一些研究但没有出现。很多人都很感激。

3 个答案:

答案 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运算符,也许将它包装在其他函数中会更好。