为何要有原型html
用构造函数生成实例对象时,缺点是没法共享属性和方法。
segmentfault
每个实例对象,都有本身的属性和方法的副本。即每生成一个实例对象时,js都会为实例分配一个内存,用来存储那些公共的属性和方法。这不只没法作到数据共享,也是极大的资源浪费函数
prototype属性就是用来解决这个问题的spa
prototype属性包含一个对象,全部实例对象须要共享的属性和方法,都放在这个对象里面;那些不须要共享的属性和方法,就放在构造函数里面.net
实例对象一旦建立,将自动引用prototype对象的属性和方法。即实例对象的属性和方法,分为两种,一种是本地的,另外一种是引用的prototype
原型(prototype)code
每个构造函数都有一个prototype属性,指向另外一个对象。这个对象的全部属性和方法,都会被构造函数的实例继承。htm
原型链对象
每个对象都会有一个指向它的原型(prototype)对象的内部连接(__proto__)。每一个原型对象又有本身的原型,直到某个对象的原型为null为止,组成这条链的最后一环。blog
Object
js中全部的对象都是Object的实例,并继承Object.prototype的属性和方法。
__proto__
定义普通对象的时候,就会生成一个_proto_,指向本身构造函数的prototype对象。(每个对象都会有的一个属性)
function Person(){}; var p = new Person();
Person.prototype.antion = function(){
console.log(123);
} consol.log(p._proto_ === Person.prototype); //true console.log(p.__proto__); //{anition:f, constructor:ƒ, __proto__:Object}
注意:proto左右是英文状态下的两个下划线!!!
prototype
拥有内部方法的对象才有的属性(这个属性指向一个对象,也能够称其为对象),例如函数,对象的方法,Object(内置方法为toString、valueOf)。指向一个原型对象,能够访问
指向的这个原型对象其实就是自身的原型,能够为这个原型添加属性和对象(方法),甚至能够指向一个现有的对象
函数在被定义的时候就拥有了一个prototype对象
function Person(){}; var p = new Person();
console.log(Person.prototype); //{func:f, constructor:f, __proto__:Object}
二、Object.prototype 是原型链上最后一个有属性的原型,也就是说,Object.prototype 的原型是 null。全部对象都继承了 Object.prototype 的属性,咱们也能够向 Object.prototype 中添加属性
function Person(){};
var p = new Person(); Object.prototype.F = function(){ console.log(“我是最后一个原型了~”); }
p.F(); //“我是最后一个原型了~”
Person.F(); //“我是最后一个原型了~”
//p为何有 F 方法呢?觉得它会沿着 __proto__ 一层一层向上寻找,直到找到 Object.prototype
//p.__proto__指向Person.prototype,p.__proto__.__proto__ === Person.prototype.__proto__ === Object.__proto__
三、prototype 对象的另外一个属性是constructor,这个属性指向了函数自己,也就是它本身的构造函数。
图示
参考:
http://www.javashuo.com/article/p-qvktecag-bb.html