原型与原型链
JavaScript有着七种基本类型String、Number、Boolean、Null、Undefined、Symbol、Object,前六种为基本数据类型,Object为引用类型。函数本质上是Object类型,也就是一个对象。
值得注意的是typeof (null)会返回Object,这是因为JS二进制前三位都为0的话会被判断为Object类型,null的二进制表示是全0,自然前三位也是0,所以执行typeof时会返回Object,实际null为基本数据类型。
构造函数对象
构造一个Student类,实例化Student出stu实例对象。
1 2 3 4
   | function Student() {} var stu = new Student(); stu.name = "Ming"; console.log(stu.name) 
  | 
 
prototype
每个函数对象都会有一个prototype属性,prototype就是调用构造函数所创建的那个实例对象的原型,prototype可以让所有对象实例共享它所包含的属性和方法。
1 2 3 4 5 6 7 8 9
   | function Student() {} Student.prototype = {     from: "sdust" } var stu1 = new Student(); var stu2 = new Student();
  console.log(stu1.from)  console.log(stu2.from) 
  | 
 
__proto__
__proto__ 是原型链查询中实际用到的,它总是指向prototype,就是指向构造函数Student的原型对象prototype。例如实例化的stu会使用__proto__向Student的prototype寻找方法或属性。若stu寻找到了调用的方法或属性,则不会使用__proto__寻找原型对象。
1 2 3 4 5 6 7 8 9 10 11 12
   | function Student() {} Student.prototype = {     from: "sdust" } var stu = new Student();
 
  console.log(stu.__proto__ === Student.prototype)  console.log(stu.from) 
  stu.from = "s"; console.log(stu.from) 
  | 
 
constructor
每个原型都有一个constructor属性指向关联的构造函数Student,实例的constructor指向构造函数Student。
1 2 3 4 5
   | function Student() {} var stu = new Student();
  console.log(Student.prototype.constructor === Student)  console.log(stu.constructor === Student) 
  | 
 
原型链
原型链可以简单理解为将原型连成一条链,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找,直到查找到原型链的顶端,也就是Object的原型。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
   | function parent() {     this.parentInfo = "parent"; }
  parent.prototype.getParentInfo = function() {     return this.parentInfo; };
  function child(){     this.childInfo = "child"; }
  parent.prototype.getChildInfo = function() {     return this.childInfo; };
  child.prototype = new parent();
  var instance = new child();
  console.log(instance.getChildInfo());  console.log(instance.getParentInfo());  console.log(instance.parentInfo);  console.log(instance.__proto__ === child.prototype);  console.log(instance.__proto__.__proto__ === parent.prototype);  console.log(instance.__proto__.__proto__.__proto__ === Object.prototype);  console.log(instance.__proto__.__proto__.__proto__.__proto__ === null); 
 
 
 
 
 
 
 
  |