如何理解Javascript中类和对象这两个概念?
首先要理解的是Javascript语言层面没有“类”的概念。一切皆对象,继承靠原型链,多态靠弱类型,封装……虽然可以靠闭包,但我个人更推崇和python一样的,下划线代表私有的风格
题目太大一次写不完……有空慢慢维护吧
其他语言没什么大区别,区别在JavaScript中类实现方式。
类 :对一群具有相同特征的对象的集合的描述;
对象:真实存在的对象个体;
举个简单的例子:“最近养了一个动物,就是我家的小猫”。在这里里面:
动物——>类
我家的小猫——>对象
Javascript中的function作为构造函数时,就是一个类,搭配上new操作符,可以返回一个对象。
当然,要生成一个对象,也可以用字面量的形式,例如var obj = {x: 1, y: function(){} };
类可以理解为一个模板,而对象就是根据这个模板造出来的具体实例。
写的比较简洁,希望有所帮助。
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
6 回答2.4k 阅读
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
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 那一套,不合适),还有其他很广阔的应用场景,比如元编程,比如函数式编程等等都值得你去了解和尝试。
法无定法,因而幻化无穷。这就是对象。