原型和原型链

var a = {} 其实是 var a = new Object() 的语法糖

var a = [] 其实是 var a = new Array() 的语法糖

function Foo(){...}其实是 var Foo = new Function(){...}的语法糖

5条原型规则

1. 所有的引用类型(对象、数组、函数)都有对象特性,可自由扩展属性(null除外)

2.所有的引用类型(对象、数组、函数)都有一个__proto__属性,属性值是一个普通的对象

3.所有的函数都有一个prototype属性,属性值是一个普通的对象

4.所有的引用类型(对象、数组、函数),__proto__属性值指向它的构造函数的prototype属性值

5。当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它构造函数的prototype中寻找)

每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给所有对象实例

new 创建对象的过程

1.创建一个新对象

2. this指向这个新对象

3. 执行代码,即对this赋值

4. 返回this

function aa(){

  a.prototype.name="Micheal";

  a.prototype.showNmae=function(){

    console.log(this.name);

  }

}

function AA(){

  A.prototype.age=15;

  A.prototype.showAge=function(){

    console.log(this.age);

  }

}

//AA继承aa

AA.prototype = new aa();

var BB = new AA();

console.log(BB);

console.log(BB.showName());  //Micheal

大致流程就是通过AA.prototype=new aa();使得AA.prototype(原型对象)下的__prototype__指向aa.prototype,当创建引用类型AA的实例化对象BB时,BB内部会产生一个__proto__属性指向AA的对象原型,再通过AA原型对象中的__proto__指向aa的原型对象,从而实现实例对象BB对aa的继承,整个链向:BB的__proto__-->AA.prototype-->aa.prototype,这就是一条原型链,如果再继续延伸的话,aa的原型对象下的__proto__属性会指向Function本身。

本人正在不断地学习和摸索中,如有错误,欢迎指正!




原文地址:https://www.cnblogs.com/xuniannian/p/7453135.html