JavaScript(二)之面向对象小知识
一、原型对象与原型链
1.1 prototype属性
JavaScript的每个对象都继承另一个对象,父级对象成为原型对象;
只有null除外,它没有自己的原型对象。
每一个构造函数都有一个prototype属性,这个属性就是实例对象的原型对象。
原型对象的属性不是实例对象自身的属性,但只要修改原型对象,变动就会立刻体现在所有实例对象上
如果实例对象自身就有某个属性或方法,那么原型对象上的属性和方法会失效;
1.2 原型链
对象的属性和方法,有可能是定义在自身内,也有可能是定义在它的原型对象上。
由于原型本身也是对象,又有自己的原型,就形成了一条原型链。
如果一层层上溯,所有对象的原型最终都可以上溯到Object;
对象.__proto__ :获取对象的原型对象
作用:
读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,
如果还是找不到,就到原型的原型去找,如果知道最顶层的Object.prototype还是找不到,则返回undefined;
1.3原型操作
1.3.1 constructor属性
对象有一个constructor属性,指向原型对象所在的构造函数;
1.3.2设置获取原型对象
Object.getPrototypeOf() :返回一个对象的原型对象
Object.setPrototypeOf() :为现有对象设置原型对象 【第一个是现有对象,第二个是要设置成为原型对象的对象】
proto属性:用__proto__来获取原型对象,如果给__proto__属性复制,则是设置原型对象。
获取 原型对象方法有三种:
1)obj.__proto__
2)obj.constructor.prototype
3)obj.getPrototypeOf(obj)
三者比较:
前两种都不很可靠
__proto__属性只有浏览器才需要部署,其他环境可以不部署;
而obj.constructor.prototype在手动改变原型对象时,会失效。
推荐使用第三种
二、闭包
闭包最大的用处:
1)可以读取函数内部的变量
2)让这些变量始终保持在内存中,
注意:外层函数每次运行,都会生成一个闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。