原型的主要作用:共享数据,节省空间!

需要一个共享的空间,在里面存放一些公共的方法,属性,这就是原型。

什么是原型?

1、对于构造函数Person 来说,他有一个prototype的属性,prototype是一个对象,他叫显式原型。

prototype是给程序员使用的,是标准的属性,且只有函数有这个属性。

在prototype中有默认的几个属性,如constructor构造器等

2、对于一个实例对象per1来说,他有一个__proto__的属性,__proto__是一个对象,他叫隐式原型。

__proto__是给浏览器使用的,不是标准的属性,且IE8不支持。

 

原型中的this指向?

 

原型中的this指向  为  调用这个方法的实例对象。就是哪个实例对象调用这个方法,this就指向哪个实例对象!

 

原型的指向可以改变吗?

原型是一个构造函数中的一个属性,同时他也是一个对象!对象中存放的是地址,他指向一块内存空间。在这个内存空间中存放着公共的属性和方法。

 

1  function Person(name) {
2     this.name = name;
3  }
4
5  Person.prototype.eat = function () {
6     console.log("eat");
7  }
8
9  Person.prototype = {
10     sayHi : function () {
11         console.log("Hello");
12     }
13 }
eat 在以前指向的那块内存空间里面,而原型指向已经发生了改变,不再指向之前的那块空间了,现在指向的是有sayHi的那块内存空间。

 

 

 

因此原型的指向是可以改变的。

 

原型链是什么?

它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承。

 

在了解原型链之前。我们要知道,任何对象中都有__proto__属性,其指向某个构造函数的prototype对象。

 

构造函数的prototype属性,也是对象,因此他也有__proto__属性。

而我们知道,实例对象的__proto__指向的是其构造函数的 prototype对象。那么,我们是不是可以推出--->prototype对象因为有__proto__属性,所以,他也是一个实例对象,其__proto__属性的指向为某个构造函数的prototype对象。同样某个构造函数的prototype对象也有__proto__属性,他也有指向的prototype对象,因此就会形成一条原型链!