Javascript文字vs函数oop

Javascript literal vs function oop

本文关键字:oop 函数 vs 文字 Javascript      更新时间:2023-09-26

使用这些的最佳实践是什么?

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

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的副本。缺点是ax实例的用户可用。

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

函数通常写成命名函数,而不是赋值给变量的匿名函数:

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

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

var y = new x();

为对象指定方法的另一种方法是将其放在原型中:

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

通常这取决于你想要得到什么。记住,JS没有真正的类,它是基于原型的语言。操作符new很容易引起误解。

我建议在可能的情况下使用文字{}。例如,您可以这样做:

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

如果你只需要一个实例,你可以在定义了这个函数之后调用它。

但是如果你想使用prototype,它可以更容易与构造函数-但仍然,我不会使用新的操作符,也许包装它在一些其他的函数会更好。