oop通常情况下都有类的概念,而javascript是个奇葩,它没有,所以它可以被称为"无序属性的集合"。
这是javascript高级程序中描述的javascript面向对面的概念。而在MDN中给出了,面向对象的三个特性:模块化,多态和封装。
作为一个在项目中总结,非科班出生的码农来说,是否可以理解为:对于相同功能、属性的归类呢?目的可能是尽量减少代码量,能够复用,类似前端框架里面的组件思想????(愚蠢的猜测,简单的总结,请大佬指正)
要理解面向对象,需要理解javascript中的对象概念,js高级程序中写的是:实例化就能创建一个对象,用一些笨办法(一个‘.’)可以一个个添加属性和方法,用字面量语法(即一个对象符号)就能在里面添加很多方法属性了。
一旦定义好属性,就不好修改了。但与此同时,定义好的属性有一些特征值,这些特征值分为两个属性:数据属性和访问属性。这里就涉及到了object.defineProperty()方法(框架双向数据绑定的原理),通过此方法的第三个传参即可以修改当前值。
面向对象一个非常重要的模式即构造函数模式,多了一个this指向的问题,写法其实和字面量语法类似,通过new调用构造函数,当然也可以通过bind、apply、call进行调用,这里涉及改变this指向问题。构造函数可以通过instaceof判断该实例类型。
缺点是:构造函数里面的方法和属性只能被某个对象调用,如果需要定义很多方法,就要定义很多个全局函数。
为了共享所有实例的属性和方法,由此诞生了prototype。它是一个指针,指向包含所有属性和方法的对象,这里涉及到了原型链知识。高级程序设计一书中的图示非常清晰地表示出了构造函数、原型对象和实例之间的关系。
解决方式1:组合使用构造函数和原型模式,构造函数定义实例属性,原型对象定义共享的方法和属性。
解决方式2:动态初始化原型对象,在实例化之前进行if语句判断是否需要在初始化之前添加方法。注意:必须在初始化之前判断,重写原型对象是不可以的。
其余方法省略。
来说原型链。当我们通过原型来继承时,原型实际上会变成另一个类型的实例,层层递进,于是就产生了原型链。
1.借用构造函数:伪造对象,在子类型构造函数内部调用超类型构造函数。
2.组合继承: