原型的主要作用:共享数据,节省空间!
需要一个共享的空间,在里面存放一些公共的方法,属性,这就是原型。
什么是原型?
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对象,因此就会形成一条原型链!