您的位置:首页 > 其它

面向对象之原型链

2016-06-24 18:10 169 查看

原型链的认识

既然提到原型链,就需要和构造函数联系起来进行理解;

构造函数的认识

其实构造函数时函数调用的一种模式,例如创建了一个函数,然后通过一个变量new了这个函数,那么这个函数就可以成为构造函数,可以从作用上来理解它为什么叫构造函数,直白点可以说是来构造一个对象出来的,实际上是实例化了一个对象出来,任何通过new来进行操作的函数都可以成为构造函数。
接下来那么这个被new出来的对象就会继承创建出来的那个函数的属性,前提是在构造函数内部通过
this.属性名
这样的属性new出来的实例对象才能拥有。

引出原型链的认识

当new出的这个实例对象需要访问某个属性时,首先它会在其本身查找,也可以理解为是先看其构造函数内部有没有通过
this.属性名
初始化这个属性,如果没有找到这个属性,也就是没有从本身找到这个属性,那么它就会往上查找,这个查找过程中查的那条链就叫做原型链,具体了解可以看引申出来属性搜索原则,下面有总结,其实这也和原型继承这个机制是联系在一起的,可以说设计这个原型链就是为原型继承服务的;

构造函数的整个过程:

1、new申请内存,创建对象,(new运算符可以称作新建运算符);

2、调用构造函数,构造函数有一个隐式参数,即this;

3、刚创建出来的对象的引用赋值给this,由函数处理;(其实主要就是利用new能够动态改变this的指向)

4、在构造函数中利用this.成员 = 值来给对象添加成员

构造函数的优势:

①、对象就有独立的原型对象;

②、也具有类型名了

属性搜索原则

①、在当前对象中找;

②、在构造函数定义规则中找;

③、在其原型对象中找;

④、在其原型对象的原型对象中找…….直到Object.prototype,这等于就是在其原型链上寻找

⑤、如果没有则返回undefined;

稍微深入的理解下原型

其实对象中有一个属性 叫 proto
通过调试可以发现 对象的 proto 与创建(实例化)它的构造函数的 prototype 是一个东西
看下面的代码测试:

function F() { //声明一个构造函数

}
var o = new F(); //通过这个构造函数实例化一个对象o

console.log( o.__proto__ === F.prototype ); //true



注意一下 proto 是非标准属性,这里也只是辅助理解来运用下,实际工作中不要采用它来进行业务逻辑


原型对象与原型属性

F.prototype
是构造函数 F 的原型属性
F.prototype
是对象 o 的原型对象

proto与prototype有什么区别

_proto_
是站在对象的角度讨论其原型对象
prototype
是站在构造函数的角度讨论其原型属性,或构造函数创建的对象的原型对象
也可以理解成所站的位置不同,就会有不同的角色。


上面的这些理论知识还是会有些抽象,抽时间我会把原型链画一下,那样理解起来就清晰了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: