JavaScript,js面向对象编程
您的位置: 主页 > web前端文章 > javascript >

OOP,JavaScript和所谓的类【访问量:197】

用对象和类进行编程始于20世纪60年代后期,采用Simula编程语言。它的创造者Ole-JohanDahl和KristenNygaard并没有用这些词来描述最终将成为计算领域的主导范式。

十年之后,AlanKay博士创造了“面向对象的编程”一词以及共同创建Smalltalk编程语言。他有一句名言:对他来说,“OOP”是用对象相互沟通的信息,而其他语言则复制了那些与Smalltalk无关的事物,而忽视了他认为重要的事情。

从那时起,语言就在他们现有的范式(比如ObjectPascal和OCaml)之上将对象思想固定下来,并与其他范式(比如JavaScript)一起烘焙,或者全心全意地接受对象。

这就是说,“面向对象”实际上没有一个定义。一方面,没有一个“对象”的定义。

对象

一些语言,如Smalltalk和Ruby,将对象视为完全封装的实体。没有访问对象的私有状态,你只能调用它的一个方法。其他语言,如Java,允许对象访问彼此的状态。

有些语言(像Java一样)具有非常严格的对象和类,在运行时向对象添加新的方法或属性是不可能的或尴尬的。有些在运行时可以灵活地添加方法和属性。而其他语言将对象视为字典,其中可以添加,修改或删除属性和方法。

所以我们可以看到,“对象”的概念在各种语言中都很灵活。

“类”的概念在各种语言中也很灵活。面向对象的语言不一致地认同类是否是必需的,更不用说它们是如何工作的。例如,CommonLisp对象系统定义了类的行为,它还定义了泛型函数的行为。在自我和NewtonScript语言有原型的,而不是类。

所以一些“OO”语言有对象,但不包括类。

C++有类,但它们不是“第一类实体”。您不能将类分配给变量或将其传递给函数。但是,您可以操作类的构造函数,即创建新对象的函数。但是你不能操纵那些构造函数来改变已经构造的对象的行为,默认情况下,实例行为是早期绑定的。

Ruby有类,它们是一流的实体。你可以向一个对象提出它的类,你可以把一个类放入一个变量中,将它传递给一个方法,或者从方法中返回它,就像该语言中的其他实体一样。Ruby和Smalltalk中的类甚至有它们自己的类,它们是Class!1实例行为是延迟绑定并打开以进行扩展。2

建设者

一些语言允许程序独立构建对象,其他语言(尤其是那些严重以类为中心的)要求对象始终由它们的类构建。某些语言允许将任何函数或方法用作构造函数,其他语言则需要特殊的构造函数语法或声明。

原型不是类

像Self和NewtonScript这样的原型语言完全避开了类,使用原型来定义一组对象的共同行为。原型和班级之间的区别类似于模型家和家庭蓝图之间的区别。

你可以对建筑商说,“让我像家庭样板一样,成为一个家”,建造者会让你成为与模特家有很多共同点的家。然后,您用更多的个性化装饰您的家。但这个样板房本身就是一个家。虽然你可以选择保持空置,但你原则上可以将一个家庭移入其中。这与要求建筑商根据蓝图让你成为家庭不同。蓝图可以指定房屋的特征,但它不是家庭。它永远不能用作家庭。

原型就像样板房,而类就像蓝图。类不像它们描述的对象。3

“面向对象编程”几乎意味着任何事情

从这个“面向对象编程”的旋风之旅中,我们可以看到,“面向对象编程”背后的思想在编程语言的历史中有着一些共同的根源,但是每种语言都以它自己特定的方式实现了它自己特有的风格。

因此,当我们在JavaScript中讨论“对象”,“原型”和“类”时,我们讨论的是用JavaScript实现的对象,原型和类。我们必须记住,其他语言对这些想法可能有截然不同的看法。

javascript方法

JavaScript有对象,默认情况下,这些对象是字典。默认情况下,对象直接操纵对方的状态。方法可以在运行时添加到对象或从对象中移除。

JavaScript有可选的原型。原型是与房屋模型相同的意义。

在JavaScript中,对象和数组文字分别构造将行为委托给标准库的对象原型和数组原型的对象。JavaScript还支持使用Object.create构造对象来构造具有或不具有原型的new对象,并使用构造函数构造对象。

使用原型和构造函数,JavaScript程序可以模拟其他语言中的许多类功能。JavaScript也有一个class关键字,它提供了用于以声明方式编写构造函数和原型的语法糖。

默认情况下,JavaScript类是一个由对象作为关联原型组成的构造函数。这可以用class关键字,通过使用函数的默认.prototype属性,或通过独立组合函数和对象来表示。

JavaScript类是构造函数,但它们不仅仅是C++构造函数,因为它们的原型操作扩展或修改了它们创建的实例的行为。与JavaScript对象采用最小的OO方法相同,JavaScript类对OO采用极简主义方法。例如,行为可以使用完全相同的机制混合到对象,原型或类中,因为对象,原型和构造函数的原型都是对象。

总之,JavaScript与其他任何面向对象的编程语言并不完全相同,它的类不像其他任何具有类的语言,但是再一次,它也不是任何其他面向对象的编程语言,也不是任何其他类。


2018-04-03
匿名评论