可以使用哪些技术在JavaScript中定义类,它们的权衡是什么?

2022-08-29 22:34:23

我更喜欢在大型项目中使用OOP,就像我现在正在做的那个项目一样。我需要在JavaScript中创建几个类,但是,如果我没有记错的话,至少有几种方法可以做到这一点。语法是什么,为什么会以这种方式完成?

我想避免使用第三方库 - 至少在一开始是这样。
寻找其他答案,我找到了文章面向对象编程与JavaScript,第一部分:继承 - Doc JavaScript,讨论了JavaScript中的面向对象编程。有没有更好的继承方法?


答案 1

以下是在不使用任何外部库的情况下执行此操作的方法:

// Define a class like this
function Person(name, gender){

   // Add object properties like this
   this.name = name;
   this.gender = gender;
}

// Add methods like this.  All Person objects will be able to invoke this
Person.prototype.speak = function(){
    alert("Howdy, my name is" + this.name);
};

// Instantiate new objects with 'new'
var person = new Person("Bob", "M");

// Invoke methods like this
person.speak(); // alerts "Howdy, my name is Bob"

现在真正的答案比这更复杂。例如,JavaScript中没有类这样的东西。JavaScript 使用基于的继承方案。prototype

此外,还有许多流行的JavaScript库,它们在JavaScript中具有近似类功能的风格。你至少要看看PrototypejQuery

决定其中哪一个是“最好的”,是在Stack Overflow上开始圣战的好方法。如果你正在开始一个更大的JavaScript繁重的项目,那么绝对值得学习一个流行的库,并按照自己的方式去做。我是一个原型人,但Stack Overflow似乎倾向于jQuery。

至于只有“一种方法可以做到这一点”,没有任何依赖外部库,我的写作方式几乎就是它。


答案 2

在 JavaScript 中定义类的最佳方法是不定义类。

认真地。

面向对象有几种不同的风格,其中一些是:

  • 基于类的 OO(由 Smalltalk 首次引入)
  • 基于原型的OO(由Self首次推出)
  • 基于多方法的OO(我认为首先由CommonLoops引入)
  • 基于谓词的 OO(不知道)

可能还有其他我不认识的人。

JavaScript 实现了基于原型的 OO。在基于原型的 OO 中,通过复制其他对象(而不是从类模板实例化)来创建新对象,并且方法直接存在于对象中而不是类中。继承是通过委托完成的:如果一个对象没有方法或属性,则会在其原型(即克隆它的对象)上查找它,然后是原型的原型等等。

换句话说:没有类。

JavaScript实际上对这个模型有一个很好的调整:构造函数。您可以说,您不仅可以通过复制现有对象来创建对象,还可以“凭空”构造它们。如果使用关键字调用函数,则该函数将成为构造函数,并且关键字不会指向当前对象,而是指向新创建的“空”对象。因此,您可以按照自己喜欢的任何方式配置对象。通过这种方式,JavaScript构造函数可以承担传统基于类的OO中的类角色之一:充当新对象的模板或蓝图。newthis

现在,JavaScript是一种非常强大的语言,所以如果你愿意,在JavaScript中实现一个基于类的OO系统是很容易的。但是,只有在您确实需要它时才应该这样做,而不仅仅是因为这是Java的方式。