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)让这些变量始终保持在内存中,

注意:外层函数每次运行,都会生成一个闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。

 

posted @ 2018-03-22 18:27  爱music的程序猿  阅读(55)  评论(0编辑  收藏  举报