如何理解Javascript中类和对象这两个概念?

如何理解Javascript中类和对象这两个概念?

阅读 10.2k
6 个回答

Javascript 没有提供“类”这种语法结构,也就是类似 Java 语言里的 class,不过 Javascript 的确有保留 class 这一关键字。

Javascript 是面向对象语言,比 Java 还要彻底的面向对象。在 Javascript 中使用“构造器”来实现对象的类型化。构造器就是函数,惯例是首字母大写函数名来代表这是一个构造器,用 new构造器名字 来创建实例对象,在构造器(及其原型属性对象)内部,this 指代实例对象。

Javascript采用“原型继承”而不是“类型继承”,通过对象的原型链进行属性(方法)的查找。

以上细节可参看我博客里的《理解 Javascript》系列

至于对象,Javascript 里几乎一切都是对象(除了个别特例)。很多人简单的把 JSON 视作 Javascript 对象简直是大谬!Javascript 采用 {} 作为基本对象类型(Object)的字面量表达形式,而 JSON 则是借鉴这种形式创造出来的一种数据格式而已,形似而神非。

如何理解对象和类?

只要记住一句话:

面向对象,而不是面向类。

类只是我们用来组织对象和构造程序的一种形式,它本质上源自于人们对于现实世界中的一种概念映射,即:凡是具有共同点的部分便可以抽象成一类,抽象层次越高,类在继承体系中的层级越高(或者说越低,看你从哪个方向来看了,总之就是越来越基础,直到成为一切衍生类型的始祖)。

相应的,在 Javascript 里,一切对象归根结底都是源自于 Object,如果你扩展(重载)了 Object 的原型(Javascript 基于原型继承),那么其他的一切对象都可以获得这些扩展(重载)。所以在 Javascript 的世界里,类不是必须的,没有类一样可以面向对象。

我们采用构造函数来模拟类,只是为了能在应用的业务领域里重现基于类语言的那种类型化(更容易和我们看待事物的方式相匹配),但是由于一些语言设计上的不足甚至是错误,使得 Javascript 很难完整的实现经典类型系统。比如说要实现私有成员属性,就要先理解 Closure(闭包),这对很多初学者来说是一个障碍(但有的时候你更应该问问自己:我非得这样做不可吗?)。

你要抛开形式上的对比,直入去理解对象的本质。在更高版本的 Javascript 里(harmony),将直接实现基于 class 的类型系统(未定),届时构造器的繁琐实现应当会成为历史了,但是面向对象的本质并没有变,Javascript 还是可以不必非用类来写程序。

Javascript 被设计成一种非常灵活的编程语言,我们不应把目光局限在经典的类型系统中(别学 Java 那一套,不合适),还有其他很广阔的应用场景,比如元编程,比如函数式编程等等都值得你去了解和尝试。

法无定法,因而幻化无穷。这就是对象。

首先要理解的是Javascript语言层面没有“类”的概念。一切皆对象,继承靠原型链,多态靠弱类型,封装……虽然可以靠闭包,但我个人更推崇和python一样的,下划线代表私有的风格

题目太大一次写不完……有空慢慢维护吧

其他语言没什么大区别,区别在JavaScript中类实现方式。

类 :对一群具有相同特征的对象的集合的描述;
对象:真实存在的对象个体;

举个简单的例子:“最近养了一个动物,就是我家的小猫”。在这里里面:
动物——>类
我家的小猫——>对象

各种语言的类和对象都是差不多的。。。

类:比如人类,指的是一个范围;
对象:比如某个人,指的是这个范围中具体的对象。

js里一切皆对象,类则是用用对象的方法模拟了传统编程语言中的类概念,包含了属性,扩展,继承等等

Javascript中的function作为构造函数时,就是一个类,搭配上new操作符,可以返回一个对象。
当然,要生成一个对象,也可以用字面量的形式,例如var obj = {x: 1, y: function(){} };
类可以理解为一个模板,而对象就是根据这个模板造出来的具体实例。

写的比较简洁,希望有所帮助。

推荐问题
宣传栏