有哪些技术可用于在JavaScript中定义类,它们各自的权衡是什么?
有哪些技术可用于在JavaScript中定义类,它们各自的权衡是什么?
我更喜欢在像我正在工作的大型项目中使用面向对象编程(OOP)。我需要在JavaScript中创建几个类,但如果我没有弄错,至少有几种方法可以实现。那么语法是什么,为什么要以这种方式实现?
我想避免使用第三方库 - 至少在最初。
在寻找其他答案时,我发现了文章《Object-Oriented Programming with JavaScript,Part I:Inheritance - Doc JavaScript》,其中讨论了JavaScript中的面向对象编程。是否有更好的继承方式?
在 JavaScript 中定义类的最佳方法是不定义类。
认真的。
面向对象有几种不同类型的风格,其中一些包括:
- 基于类的 OO(由 Smalltalk 首先引入)
- 基于原型的 OO(由 Self 首先引入)
- 基于多方法的 OO(我认为是由 CommonLoops 首先引入的)
- 基于谓词的 OO(不知道)
还有其他我不知道的类型。
JavaScript 实现了基于原型的面向对象。在基于原型的 OO 中,新对象通过复制其他对象创建(而不是从类模板实例化),方法直接存在于对象中而不是在类中。通过委托实现继承:如果对象没有方法或属性,则在其原型上查找(即复制自的对象),然后是原型的原型等等。
换句话说:没有类。
JavaScript 实际上对该模型有很好的调整:构造函数。你不仅可以通过复制现有对象创建对象,还可以从头开始构建它们。如果使用 new
关键字调用函数,该函数就成为构造函数,this
关键字将不指向当前对象,而是指向新创建的“空”对象。所以,你可以按照自己的方式配置对象。因此,JavaScript 构造函数可以扮演传统基于类的 OO 中类的角色之一:作为新对象的模板或蓝图。
现在,JavaScript 是一种非常强大的语言,因此如果你想要的话,可以很容易地在 JavaScript 中实现基于类的 OO 系统。但是,你应该只在真正需要时才这样做,而不仅仅是因为 Java 那样做。
以下是在不使用任何外部库的情况下进行操作的方法:
// 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中近似类似的功能。您至少需要查看 Prototype 和 jQuery。
决定哪个是“最好的”是在 Stack Overflow 上开启战争的好方法。 如果正在进行大型JavaScript项目,值得学习流行的库并按照他们的方式进行操作。 我是 Prototype 的人,但 Stack Overflow 似乎倾向于 jQuery。
至于是否只有“一种方法”进行操作,而且没有依赖于外部库,那么我编写的方法就是基本上的方法。