JavaScript的原型和原型链

一、JavaScript使用原型与原型链的原因

  1、JavaScript语言是在特定时期中对多种语言的特性集合体,使用了Scheme的一等函数(函数式编程)和self的原型和原型链、JAVA的基本类型和对象类型。

  2、语言的开发者基于原型的对象模型的强烈偏好,使用该模型解决传统的类和实例对立,基类让实例对不可预料的新需求无法扩展,所以提出原型,通过提供自己的行为,填补新实例的空白的实例,不影响其他子实例,相当于对“基类”进行修改。

  3、通过类创建对象,会产生很多对象导致代码冗余和占用内存,使用prototype属性将对象的方法挂载到类中,让所有对象通过原型链共享方法,减少通过类创建对象代码冗余和占用内存。

  4、原型链消除了客户端web编程的复杂性,解决了实际问题,为浏览器脚本环境添加有用的扩展,并且在Ajax和文档对象模型中提供优雅的API。

二、JavaScript的原型与原型的链理解

  JavaScript使用了原型方式没有使用传统类和对象,所以对象创建、继承、封装的特性通过函数和原型实现,因为没有类的概念所以使用函数来模拟创建对象的过程的函数称为构造函数。原型(prototype)是函数(构造函数)的属性,通过该属性(对象)封装变量和方法,使用该构造函数创建的对象其隐式属性(__proto__)指向构造函数的prototype,而且prototype属性是一个对象,可以赋值给任何构造函数的prototype,这样就形成原型链。通过构造函数创建对象,原型实现方法和属性的继承(共享的方式)。所以对象的属性查找过程是首先是字面量属性和构造函数(this)定义的属性,其次是通过隐式属性查找原型链直到查找到“基类”对象Object的原型是NULL。

  1、每个函数都可以是构造函数,每个对象都可以是原型对象。

  2、由于普通对象可以是原型对象,也可以是实例对象,所以很容易实现继承关系。

  3、构造函数的prototype与所有实例对象的__proto__都指向原型对象。

  4、原型对象与实例对象的constructor属性都指向构造函数。

  5、prototype对构造函数(基类)约定的属性和方法进行动态扩展,__proto__是实例对象查找“基类”扩展属性,实例对象首先是拥有构造函数的属性和方法,然后是继承prototype对象的属性和方法。

三、JavaScript的构造函数

  var a = {} => var a = new Object();对象的构造函数是Object
  var a = [] => var a = new Array();数组的构造函数是Array
  function foo(){} => var foo = Function();函数的构造函数是Function

四、JavaScript的对象字面量

  var a = {name:'a',number:0},该方式是以键值对(hashtale)的关联数组,创建对象强调的是该对象仅仅是可变的hash映射而不是通过对象获取属性和方法。使用字面量定义对象可以减少代码和查找原型链的过程,其不必通过构造函数和原型一样派生于“基类”。

五、JavaScript的对象创建

  定义构造函数,var A = function(){this.i = 'i';this.j='j'} ;,构造函数和其内部属性i和j。

  定义构造函数原型,A.prototype = { k:'k', show:function(var that = this;console.log(that.i);) } ;,定义属性和方法,由构造函数创建对象对其继承关系。

  定义对象,var a = new A();通过构造函数创建对象,并且继承原型,其隐式属性__proto__指向原型。

  定义构造函数,var B = function(){}

  定义构造函数原型,B.prototype = a; B的原型是通过构造函数A创建的对象a,所以B的属性可以查找到A的原型链,最终查找到Object原型NULL为止。

posted @ 2017-09-11 09:05  tuqunfu  阅读(172)  评论(0编辑  收藏  举报