javascript对象和原型链
- javascript数据类型
ECMAScirpt 有两种不同的数据类型:基本类型,引用类型。也有其他的叫法,比如原始类型和对象类型、拥有方法的类型和不能拥有方法的类型、可变类型和不可变类型,其实这些叫法都是依据这两种的类型特点来命名的。
- 基本类型:字符串(string)、数字(number)、布尔(boolean)、Null(null)、Undefined(undefined)。
- 引用类型:javascript中除了上面的基本类型之外就是引用类型了,也可以说是就是对象了。对象是属性和方法的集合。
- 创建对象的方式:
1. var someThing = new Object();
2. var anotherThing = {};
第一种方法和在其它面向对象的语言中使用某个类的构造函数创建一个对象是一模一样的。第二种方法是使用对象字面量来定义一个对象更简洁。
- 原型链
和其它的面向对象编程语言不同, javascript 不是基于类的代码复用体系,它选择了一种很奇特的基于原型的代码复用机制。
通俗点说,如果想创建很多对象,而这些对象有某些相同的属性和行为,为每一个对象编写单独的代码肯定是不合算的。在其它的面向对象编程语言中,可以先设计一个类,然后再以这个类为模板来创建对象。
而在javascript中,解决这个问题的方式是把一个对象作为另外一个对象的原型,当访问一个对象的属性或方法的时候,先在对象本身中查找,如果找不到,则到原型中查找,如果还是找不到,则进一步在原型的原型中查找,一直到原型链的最末端,拥有相同原型的对象自然拥有了相同的属性和行为。
- 原型
javascript中不管以什么方式创建一个对象,它都会自动给你生成一个原型对象,对象中有一个隐藏的proto属性,它指向这个自动生成的原型对象。而且,自动生成的原型对象也是对象,所以它也有自己的原型对象。
- 构造函数
在javascript中不管你以什么方式创建一个对象,它最终都是从构造函数生成的,以对象字面量构造的对象也有构造函数,它们分别是Object()和Array()。在定义构造函数的时候,系统自动创建的一个和构造函数相关联的原型对象,构造函数的prototype属性指向那个自动创建的原型对象。javascript 中还内置了Object()、Array()、String()、Number()、Boolean()、Function()这一系列的构造函数。
因为构造函数也是对象,所以构造函数既有prototype属性,又有proto属性。proptotype属性指向和构造函数相关联的原型对象,而proto才是构造函数的原型对象。
- 原型链分析
先考察对象someThing,哪怕它是以对象字面量的方式创建的,它也是从构造函数Object()构造出来的。这时对象someThing的proto属性也指向与构造函数Object()相关联的原型对象,即Object.prototype指向的对象。也就是说,构造函数Object()的prototype属性和对象someThing的proto属性指向的是同一个原型对象。而且,这个原型对象Object.prototype中有一个constructor属性,它又指回了构造函数Object(),这样形成了一个环形的连接。
然后考察构造函数,构造函数首先是函数,函数在javascript中也是对象。因为所有的对象都有构造函数,所以函数的构造函数为Function(),根据上面论述的内容那么所有的函数对象的原型对象即为Function.prototype,构造函数也不例外。