对于很多前端开发者来说,JavaScriptPrototype确实是一件很头疼的事情,所以在这里我整理一下自己对相应Prototype的理解,分享给大家,以供交流。Prototype说到prototype,就不得不说说prototype、__proto__、constructor的关系。比较麻烦的是,很容易混淆prototype和__proto__。这也是因为它们之间的指针确实有些复杂。functionHeternally(){};varf1=newHeternally;先通过上面两行代码创建一个函数对象,然后使用new来实例化该对象。在说原型之前,我先简单介绍几个概念:上面代码创建的Heternally()函数等构造函数,我们称之为构造函数。是用来初始化新创建的对象的函数。构造函数有一个原型属性,它指向实例对象的原型对象。由同一个构造函数实例化的多个对象具有相同的原型对象,因此常使用原型对象来实现继承。实例对象new操作构造函数创建的对象是一个实例对象。一个构造函数可以实例化多个实例对象,但是得到的实例对象并不相等。实例对象有一个proto属性,指向实例对象对应的原型对象。并且因为实例对象可以继承原型对象的属性,所以实例对象还有constructor属性,指向原型对象对应的构造函数。prototype对象有一个constructor属性,指向constructor对应的w3c上prototype属性的定义是它给了你给对象添加属性和方法的能力prototype和__proto__的区别1.prototype是一个property,只有函数有2.__proto__是每个对象都有的属性3.__ptoto__实际上是一个实体对象的属性,而原型是构造函数的属性。__ptoto__只应在学习或调试环境中使用。__proto__属性指向谁取决于创建对象时的实现方法。下面是创建对象的两种常用方法。它指向谁?字面量方法构造函数方法原型链因为__proto__是任何对象都有的属性,而js中一切都是对象,所以会形成__proto__链,递归访问__proto__最终必须结束,值为null。js引擎在查找对象的属性时,首先会检查对象本身是否存在该属性。如果不存在,则在原型链中查找,但不会找到自己的原型。图片取自原型链。所有对象都有__proto__属性,对应对象的原型。所有的函数对象都有一个prototype属性,这个属性的值会被赋值给函数创建的对象的_proto_属性。所有的原型对象都有一个constructor属性,对应于为所有指向这个原型的实例创建构造函数。函数对象和原型对象通过原型和构造函数属性相互关联。
