类与原型
类
类: 是面向对象(Object Oriented)语言实现信息封装的基础,称为类类型。每个类包含数据说明和一组操作数据或传递消息的函数。类的实例称为对象.
类: 是描述了一种代码的组织结构形式,一种在软件中对真实世界中问题领域的建模方法.
原型
JavaScript 这门语言没有类的概念,所以 JavaScript 并非是基于类的继承,而是基于原型的继承。
JavaScript 摒弃类转而使用原型作为实现继承的基础,是因为基于原型的继承相比基于类的继承上在概念上更为简单。首先我们明确一点,类存在的目的是为了实例化对象,而 JavaScript 可以直接通过对象字面量语法轻松的创建对象。
每一个函数,都有一个 prototype 属性。 所有通过函数 new 出来的对象,这个对象都有一个 __proto__
指向这个函数的 prototype。 当你想要使用一个对象(或者一个数组)的某个功能时:如果该对象本身具有这个功能,则直接使用;如果该对象本身没有这个功能,则去 __proto__
中找。
- prototype [显式原型]
prototype 是一个显式的原型属性,只有函数才拥有该属性。 每一个函数在创建之后都会拥有一个名为 prototype 的属性,这个属性指向函数的原型对象。( 通过 Function.prototype.bind 方法构造出来的函数是个例外,它没有 prototype 属性 )。
- proto[隐式原型]
prototype 理解起来不难, __proto__
理解起来就会比 prototype 稍微复杂一点。下面我们就讲讲 __proto__
。
其实这个属性指向了[[prototype],但是[[prototype]] 是内部属性,我们并不能访问到,所以使用__proto__ 来访问。
__proto__ 指向了创建该对象的构造函数的显式原型。
作用
显式原型:用来实现基于原型的继承与属性的共享。
隐式原型:构成原型链,同样用于实现基于原型的继承。
new
操作符
当我们使用 new 操作符时,生成的实例对象拥有了 __proto__
属性。即在 new 的过程中,新对象被添加了 __proto__
并且链接到构造函数的原型上。
new的过程
新生成了一个对象
链接到原型
绑定 this
返回新对象