JS面向对象的程序设计总结

oop通常情况下都有类的概念,而javascript是个奇葩,它没有,所以它可以被称为"无序属性的集合"。

这是javascript高级程序中描述的javascript面向对面的概念。而在MDN中给出了,面向对象的三个特性:模块化,多态和封装。

作为一个在项目中总结,非科班出生的码农来说,是否可以理解为:对于相同功能、属性的归类呢?目的可能是尽量减少代码量,能够复用,类似前端框架里面的组件思想????(愚蠢的猜测,简单的总结,请大佬指正)

要理解面向对象,需要理解javascript中的对象概念,js高级程序中写的是:实例化就能创建一个对象,用一些笨办法(一个‘.’)可以一个个添加属性和方法,用字面量语法(即一个对象符号)就能在里面添加很多方法属性了。

一旦定义好属性,就不好修改了。但与此同时,定义好的属性有一些特征值,这些特征值分为两个属性:数据属性和访问属性。这里就涉及到了object.defineProperty()方法(框架双向数据绑定的原理),通过此方法的第三个传参即可以修改当前值。

面向对象一个非常重要的模式即构造函数模式,多了一个this指向的问题,写法其实和字面量语法类似,通过new调用构造函数,当然也可以通过bind、apply、call进行调用,这里涉及改变this指向问题。构造函数可以通过instaceof判断该实例类型。

缺点是:构造函数里面的方法和属性只能被某个对象调用,如果需要定义很多方法,就要定义很多个全局函数。

为了共享所有实例的属性和方法,由此诞生了prototype。它是一个指针,指向包含所有属性和方法的对象,这里涉及到了原型链知识。高级程序设计一书中的图示非常清晰地表示出了构造函数、原型对象和实例之间的关系。

原型对象也存在一些问题,比如说共享引用数据类型值得时候,当通过实例修改时,原型对象的值随即被修改。

解决方式1:组合使用构造函数和原型模式,构造函数定义实例属性,原型对象定义共享的方法和属性。

解决方式2:动态初始化原型对象,在实例化之前进行if语句判断是否需要在初始化之前添加方法。注意:必须在初始化之前判断,重写原型对象是不可以的。

其余方法省略。

来说原型链。当我们通过原型来继承时,原型实际上会变成另一个类型的实例,层层递进,于是就产生了原型链。

同样的,还是之前提到过的引用类型值的问题,有几种解决方式。

1.借用构造函数:伪造对象,在子类型构造函数内部调用超类型构造函数。

2.组合继承:

3..原型式继承:
4.寄生式继承:

转载于:https://juejin.im/post/5cad73506fb9a0685a3ee837

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值