序言
与绝大部分程序词汇词汇相同,ES6以后并没导入类(class)的基本概念,JavaScript绝非透过类而要间接透过缺省来建立示例。在如是说蓝本和蓝本链以后,他们有必要性先备考呵呵缺省的科学知识。
一、缺省
缺省商业模式的目地是为的是建立两个自订类,因此建立那个类的示例。缺省商业模式中保有了类和示例的基本概念,因此示例和示例间是互相分立的,即示例辨识。
缺省是两个一般的表达式,建立形式和一般表达式没差别,相同的是缺省生活习惯上第两个字母小写。除此之外是初始化形式的相同,一般表达式是间接初始化,而缺省须要采用newURL来初始化。
每建立两个Person缺省,在Person缺省中,为每两个对象都添加了两个sayName方法,也是说缺省每执行一次就会建立两个新的sayName方法。这样就导致了缺省执行一次就会建立两个新的方法,执行10000次就会建立10000个新的方法,而10000个方法都是一摸一样的,为什么不把那个方法单独放到两个地方,并让所有的示例都可以访问到呢?这就须要蓝本(prototype)
二、蓝本
在JavaScript中,每当定义两个表达式数据类型(一般表达式、类)时候,都会天生自带两个prototype属性,那个属性指向表达式的蓝本对象,因此那个属性是两个对象数据类型的值。
让他们用一张图表示缺省和示例蓝本间的关系:
蓝本对象就相当于两个公共的区域,所有同两个类的示例都可以访问到那个蓝本对象,他们可以将对象中共有的内容,统一设置到蓝本对象中。
三、蓝本链
1.__proto__和constructor
每两个对象数据类型(一般的对象、示例、prototype……)也天生自带两个属性__proto__,属性值是当前示例所属类的蓝本(prototype)。蓝本对象中有两个属性constructor, 它指向表达式对象。
2.何为蓝本链
在JavaScript中万物都是对象,对象和对象间也有关系,并不是孤立存在的。对象间的继承关系,在JavaScript中是透过prototype对象指向父类对象,直到指向Object对象为止,这样就形成了两个蓝本指向的链条,专业术语称之为蓝本链。
举例说明:person → Person → Object ,一般人继承人类,人类继承对象类
当他们访问对象的两个属性或方法时,它会先在对象自身中寻找,如果有则间接采用,如果没则会去蓝本对象中寻找,如果找到则间接采用。如果没则去蓝本的蓝本中寻找,直到找到Object对象的蓝本,Object对象的蓝本没蓝本,如果在Object蓝本中依然没找到,则返回undefined。
他们可以采用对象的hasOwnProperty()来检查对象自身中是否含有该属性;采用in检查对象中是否含有某个属性时,如果对象中没但是蓝本中有,也会返回true
person示例中没a那个属性,从 person 对象中找不到 a 属性就会从 person 的蓝本也是 person.__proto__ ,也是 Person.prototype中查找,很幸运地得到a的值为123。那假如 person.__proto__中也没该属性,又该如何查找?
当读取示例的属性时,如果找不到,就会查找与对象关联的蓝本中的属性,如果还查不到,就去找蓝本的蓝本,一直找到最顶层Object为止。Object是JS中所有对象数据类型的基类(最顶层的类)在Object.prototype上没__proto__那个属性。
作者:浪里行舟
链接:蓝本与蓝本链简述 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。