构造函数、原型函数和原型链的关系 首先看下构造函数的一个简单例子: var Box=function(){ //声明一个类 this.name='我'; this.age=25; this.run=function(){ return this.name+this.age; } } var box1 =new Wo(); //类实例化成对象 var box2 =new Wo(); alert(p1.run()); 以上声明类的方式就叫做构造函数,这样的属性和方法就是实例属性和实例方法。 同时new了两个实例化对象box1和box2 它们的实例属性方法地址都是独立的如图: 但是new多个实例对象会造成资源的浪费所以需要公用一个地址,这时我们需要原型函数。 var Box=function(){ //声明一个类 this.prototype.name='我'; this.prototype.age=25; this.prototype.run=function(){ return this.name+this.age; } } var box1 =new Wo(); //类实例化成对象 var box2 =new Wo(); alert(p1.run()); 原型函数只需要加prototype,以上的属性和方法就是原型属性和原型方法,地址是共享的,如图: 没有定义实例属性和方法所以是空的。 我们每创建一个函数的时候就默认存在一个prototype对象,不存在__proto__。如果创建一个对象默认才会有__proto__, 对象不存在prototype,但是对象可以通过__proto__指向prototype去寻找我们需要的属性和方法。 对于说到原型函数所以就要涉及到原型链,在图中我们可以看到__proto__,只要是new出现一个实例对象就会 有__proto__,__proto__也就会自动指向prototype寻找prototype里面的原型属性和方法。 简单说下面向对象的工作流程: 1,声明一个类时,里面可以添加方法和属性。 2,实例化对象需要new,当new的时候JS就默认创建了一个__proto__对象,这个是JS内置的需要寻找原型函数用的。 3,当我们要调用面向对象里面的属性或者方法时,先去找__proto__下的实例属性和方法,如果找到了就不会在去找原型的了, 如果找不到__proto__接着就会去prototype里面寻找原型属性和方法。 原型链的核心就是__proto__。 __proto__最终指向的是原型prototype。例如在类中创建了一个原型方法,我们可以通过这样的方法调用。 p1.__proto__.run(); //调用原型的run方法 p1.__proto__.run=function(){} //这样也相当于在原型中创建了方法,因为__proto__直接指向原型。