在Javascript中,让构造函数与其创建的对象同名是一种好习惯吗?

时间:2019-02-26 09:43:53

标签: javascript

假设我们有一个代码

function Vector ( x, y ) 
{
    this.x = x 
    this.y = y
}

var Vector = new Vector() 

通常可以让对象Vector与其构造函数具有相同的名称吗?

7 个答案:

答案 0 :(得分:5)

使用与可实例化函数相同的名称不是一个好习惯,因为

  • 这令人困惑,因为您将变量的类型从实例化更改为实例化,
  • 使用以小写字母开头的实例来命名实例是一种很好的做法,
  • 它使难以理解的功能无法访问。

为防止混淆,可以将IIFE作为构造函数。

var vector = new function (x, y) {
        this.x = x 
        this.y = y
    };

console.log(vector);

答案 1 :(得分:4)

您的实例遮盖了构造函数。换句话说,除非您尝试通过constructor实例的Vector来创建实例,否则无法再访问其构造函数。

function Vector ( x, y ) 
{
    this.x = x 
    this.y = y
}

var Vector = new Vector() 

var AnotherVector = new Vector();   // <-Error here 

以上所有内容都会导致混乱和缺乏标准的JS实践。

否-不要这样做。

答案 2 :(得分:4)

为单个实例定义类听起来没用。应该将一个类用作创建同一类型的多个实例的模板。如果要第二个向量,该怎么办?

Vector = function (x, y) {
  this.x = x;
  this.y = y;
};

Vector = new Vector(1, 2); // ok
Vector = new Vector(4, 3); // error

此外,类通常是您为所有实例定义通用API(一组通用方法)的地方。

Vector = function (x, y) {
  this.x = x;
  this.y = y;
};

// Note that in old fashioned JavaScript
// you have to define inherited methods
// in a special object called `prototype`.

Vector.prototype.add = function (vector) {
  this.x += vector.x;
  this.y += vector.y;
};

Vector = new Vector(1, 1);

您实际上并不需要单个实例的此功能。在这里使用类太过分了,您只需编写以下代码即可:

Vector = {
  x: 1,
  y: 1,
  add: function (vector) {
    this.x += vector.x;
    this.y += vector.y;
  }
};

因此,我想说的是用实例覆盖类不是一个好习惯,除非这种模式有一些我从未听说过的有用的应用程序:-)

无论如何,这是在JavaScript中使用类的推荐(老式)方法。如您所见,add方法在Vector类的原型中定义了一次,但是我们可以从向量ab中调用它。

Vector = function (x, y) {
  this.x = x;
  this.y = y;
};

Vector.prototype.add = function (vector) {
  this.x += vector.x;
  this.y += vector.y;
};

Vector.prototype.toString = function () {
  return "(" + this.x + ", " + this.y + ")";
};

a = new Vector(1, 2);
b = new Vector(4, 3);
console.log("a = " + a + " b = " + b);
a.add(b);
console.log("a = " + a + " b = " + b);
b.add(a);
console.log("a = " + a + " b = " + b);

答案 3 :(得分:2)

否,这不是一个好习惯。

由于JavaScript区分大小写,请考虑在变量名称中使用所有小写字母。这样可以确保您永远不会出错,因为您滥用了大写和小写字母,而且打字手指也更容易。

克服此问题的两个标准约定是将每个单词大写并将其填入单词(例如LastName),或用下划线将每个单词分开(例如last_name)。

良好做法:

function Vector ( x, y ) 
{
  this.x = x ;
  this.y = y;
}

var vector = new Vector(1, 2); 

console.log(vector);

答案 4 :(得分:1)

Vector将不再是一个函数,所以不。您肯定不想这样做。

检查此

function Vector ( x, y ) 
{
    this.x = x 
    this.y = y
}

var Vector = new Vector() 

var Vector2 = new Vector() 

答案 5 :(得分:0)

最好以相同的名称命名对象,但以小写字母开头

答案 6 :(得分:0)

由于对象是实例,因此我将它们称为不同的实例。这取决于您的用例,因此如果知道您只有一个实例,则可以这样做。 但是想象一下有多个实例,那么有理由将它们称为不同的实例。 因此,例如,您有一个具有高xy值的对象:

var highVector = new Vector(1000, 1000) 

您仍在使用Vector一词,但现在您知道这是一种Vector

值较低的对象可以称为lowVector,依此类推。