有哪些技术可用于在JavaScript中定义类,它们各自的权衡是什么?

51 浏览
0 Comments

有哪些技术可用于在JavaScript中定义类,它们各自的权衡是什么?

我更喜欢在像我正在工作的大型项目中使用面向对象编程(OOP)。我需要在JavaScript中创建几个类,但如果我没有弄错,至少有几种方法可以实现。那么语法是什么,为什么要以这种方式实现?

我想避免使用第三方库 - 至少在最初。

在寻找其他答案时,我发现了文章《Object-Oriented Programming with JavaScript,Part I:Inheritance - Doc JavaScript》,其中讨论了JavaScript中的面向对象编程。是否有更好的继承方式?

admin 更改状态以发布 2023年5月21日
0
0 Comments

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

认真的。

面向对象有几种不同类型的风格,其中一些包括:

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

还有其他我不知道的类型。

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

换句话说:没有类。

JavaScript 实际上对该模型有很好的调整:构造函数。你不仅可以通过复制现有对象创建对象,还可以从头开始构建它们。如果使用 new 关键字调用函数,该函数就成为构造函数,this 关键字将不指向当前对象,而是指向新创建的“空”对象。所以,你可以按照自己的方式配置对象。因此,JavaScript 构造函数可以扮演传统基于类的 OO 中类的角色之一:作为新对象的模板或蓝图。

现在,JavaScript 是一种非常强大的语言,因此如果你想要的话,可以很容易地在 JavaScript 中实现基于类的 OO 系统。但是,你应该只在真正需要时才这样做,而不仅仅是因为 Java 那样做。

0
0 Comments

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

// 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项目,值得学习流行的库并按照他们的方式进行操作。 我是 Prototype 的人,但 Stack Overflow 似乎倾向于 jQuery。

至于是否只有“一种方法”进行操作,而且没有依赖于外部库,那么我编写的方法就是基本上的方法。

0