Js原型对象理解
1. 构造函数的缺点:
1.什么是构造函数?
就是function一个函数,然后都过this去创建该函数的属性和方法---这就是一个构造函数--->其他不通过this的叫普通函数
2.缺点在此:
同一个构造函数可以通过 New 创建无数个实例---》但是这些New出来的实例之间却无法共享属性,太浪费系统资源
3.JavaScript 通过构造函数生成新对象,因此构造函数可以视为对象的模板。实例对象的属性和方法,可以定义在构造函数内部
2. 通过构造函数的这个缺点便引出来--- JavaScript 的原型对象(prototype)
JavaScript 继承机制的设计思想就是,原型对象的所有属性和方法,都能被实例对象共享---》简单来说就是如果属性和方法都定义在原型上,那么所有实例边都可以共享了---》便解决了构造函数的缺点
1.例子:
function Animal(name) { this.name = name; } Animal.prototype.color = 'white'; var cat1 = new Animal('大毛'); var cat2 = new Animal('二毛'); cat1.color // 'white' cat2.color // 'white
通过上面实例更容易懂的JavaScript原型的概念
2.需要注意的地方:
当实例对象本身没有某个属性或方法的时候,它会到原型对象去寻找该属性或方法。这就是原型对象的特殊之处。
如果实例对象自身就有某个属性或方法,它就不会再去原型对象寻找这个属性或方法。
3. JavaScript原型链是什么?
JavaScript 规定,所有对象都有自己的原型对象(prototype)
1.概念:
1.一方面,任何一个对象,都可以充当其他对象的原型;
2.另一方面,由于原型对象也是对象,所以它也有自己的原型。
3.因此,就会形成一个“原型链”:对象到原型,再到原型的原型……
2.理解:
1.一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype
,即Object
构造函数的prototype
属性。也就是说,所有对象都继承了Object.prototype
的属性。这就是所有对象都有valueOf
和toString
方法的原因,因为这是从Object.prototype
继承的。
2.Object.prototype
对象有没有它的原型呢?
答案:肯定是有的---》Object.prototype的原型就是null----->由于null没有任何属性,所以即为原型链的尽头
3.注意:
读取对象的某个属性时,JavaScript 引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype
还是找不到,则返回undefined
如果对象自身和它的原型,都定义一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”
注意,一级级向上,在整个原型链上寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链
4. __proto__和constructor属性
每个构造函数都以一个prototype属性,通过这个属性可以指向自己的原型,
原型也有一个constructor属性,通过这个属性可以指向构造函数本身,可以得知某个实例对象,到底是哪一个构造函数产生的
实例也有一个_proto__属性,通过这个属性可以指向原型
实例可以访问原型上的任意方法
__proto__和prototype详细关系可以参考这篇:https://www.cnblogs.com/myfirstboke/p/9889155.html