面向对象的语言有一个标志,即拥有类的概念,它能够抽象实例对象的公共属性与方法,基于类能够建立任意多个实例对象,通常具备封装、继承、多态的特性!但JS中对象与纯面向对象语言中的对象是不一样的,ECMA标准定义JS中对象:无序属性的集合,其属性能够包含基本值、对象或者函数。能够简单理解为JS的对象是一组无序的值,其中的属性或方法都有一个名字,根据这个名字能够访问相映射的值(值能够是基本值/对象/方法)。
在类语言中,对象基于模板来建立,首先定义一个类做为对现实世界的抽象,而后由类来实例化对象;js(ES5)自己是没有class类型的,可是每一个函数都有一个prototype
属性。prototype
指向一个对象,当函数做为构造函数时,prototype
则起到相似class
的做用。好比用原型模式建立对象,只须要在构造函数的原型上面定义属性和方法,那么全部实例均可以共享原型对象上的属性和方法,由于他们内部都有一个__proto__
属性,指向了原型对象。函数
咱们建立的每一个函数都有一个prototype
属性,这个属性是一个指向原型对象指针,原型对象里包含着全部实例共享的属性和方法。同时原型对象里也有一个constructor
指回了其对应的构造函数。
每一个对象实例都会在其内部初始化一个__proto__
属性,它是一个指向prototype
(原型对象)的指针,当咱们访问一个对象的属性时,若是这个对象内部不存在这个属性,那么他就会经过__proto__
去prototype
里找这个属性,这个prototype
又会有本身的__proto__
指向本身的原型对象, 因而就这样一直找下去,造成了原型链的概念。prototype
原型链实现的是对属性的查找,一直顺着原型链查找到Object对象
,若是没查到返回undefined
,还有值得注意的一点就是,全部对象里的__proto__
都是对原型对象的一个引用,而不是副本,因此当咱们修改原型时,与之相关的对象也会继承这一改变。指针