js对象、继承,原型链相关知识及应用心得

       js是一门面向对象(Object-oriented,OO)语言,去年看《javascript高级程序设计》的时候,已经系统的学习了js对象相关的知识,但是当时好像偷了懒,学完觉得很清晰,就没有做笔记。现在到了成都,新工作中普遍使用面向对象的思想,在实践中又加深了理解,但是一些理论基础还是有些遗忘了。所以在此特意复习回顾一下,做做笔记。这里没有引用很多书面语,而是以我自己学习和实践为基础,写出对js对象的理解,若有偏差,忘斧正。如果能帮到其他小伙伴,就更开心了。

参考资料:《javascript高级程序设计(第三版)》

javascript对象

       javascript中的对象,简单来说就是数据行为的集合。 
       比如一个人对象,其中的数据可以有:姓名,年龄,性别,等等;其行为可以有:说出自己的名字,跟其他人比较年龄,跟异性产生互动等等。 
       当然,并不是所有的对象都必须有数据和行为。我们经常把对象简单的作为一种数据结构来使用,单纯的用来储存数据。他的好处在于便于查找,不需要像数组那样进行遍历,也无关顺序,查找对象中的数据,只要知道key就可以了。 
另外,对象的数据和行为,其实都是对象的属性对应的值罢了,区别只在于,一个值是数据,另一个的值时函数。这里分开描述,只是便于理解。


创建对象

1.工厂模式:创建多个相似的对象很方便

2.构造函数模式:ECMAScript冲构造函数可以用来创建特定类型的对象。任何函数只要通过new操作符调用,就可以作为构造函数,否则他就只是普通函数。 
缺点:构造函数创建多个实例时,会重复创建他们公有的方法,这就很浪费了,所以有了下边的原型模式

3.原型模式: 
在js中,只要创建了一个新函数,就会自动为其创建一个prototype属性,这个属性指向函数的原型对象。并且在默认情况下,所有原型对象会自动获得一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针。

构造函数、原型对象、对象实例之间的关系如下图: 

这里写图片描述
原型对象用来包含所有实例都需要的属性和方法,让所有的实例共享。

当代码读取某对象的值时,都会根据给定的key来进行搜索:先在实例本身上搜索,若找到,就返回该值;若没找到,则继续搜索指针指向的原型对象,在原型对象中查找,若找到就返回。

继承和原型链

继承是OO语言中的常用概念,有接口继承和实现继承。ECMAScript支持实现继承的方式。主要依靠原型链来实现。

原型链

上边说了构造函数,原型对象和对象实例之间的关系。假如我们让一个原型对象A等于另一个类型的实例,那么此时,这个原型对象作为一个实例,又有一个prototype属性指向另一个原型对象B。相应的,另一个原型对象又可以是其他原型对象C的实例。如此层层递进,就形成了一条原型链。 如下图:

这里写图片描述

如上图,所有原型链的顶端,都是Object对象,对象中存着所有对象的公用方法,也就是ECMAScript规定的方法,如hasOwnPrototype()等,然后层层继承下来。当在实例a中查询一个属性或方法时,会先在a中查找,若没有,则沿着原型链向上查找,既按照A–>B–>C–>Object的顺序依次查找,当第一次找到值,则停止查找并返回。所以,原型链下游的对象的重名属性,会覆盖掉,若没覆盖的,则使用继承来的。

实际应用:组件化

初学对象的继承和原型链的时候,完全不知道这东西到底有什么用,恐怕这也是很多初学者最大的困惑。不使用,就没有实际的案例,理解也就很虚无缥缈。后来在工作中,逐渐接触到了,才更好的理解了这些概念,下边简单的讲一讲我的理解。

在实际开发中,我们常提到组件化,就是把常用的功能进行抽象,把公共部分提取出来,变成一个公用组件,然后在其中加入一些配置项和生命周期函数,就可以在不同的地方进行使用。使用时,大部分公用功能都不用重复去写,小部分差异化的地方,只要传入相应的配置参数,修改配置或声明周期函数,即可只用少量代码,完成复杂的功能,不仅方面而且易于维护。


上边的组件化,用到的就是对象的原型和实例相关内容。组件本身是一个原型对象,在需要使用的地方进行实例化即可

实际使用中,可能会遇到更加复杂的问题,比如组件之间的继承。例如,有一个table组件,该组件能够动态渲染后端数据;能够选中某一行的数据,并对选中数据进行操作。现在我们需要一个picker组件,该组件需要点击弹框,在弹框中显示一个列表,选中列表中的数据,点击确定,来选择我们需要的数据。此时,picker就可以继承自table,然后在picker中写点击弹框,确定消失相关的一些功能即可。而picker中需要的取得列表,选中列表行等功能,table组件已经有了,就无需重复写,方便又可靠。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值