我们之前已经对对象有所了解了,现在我们来说一下面向对象。
我对面向对象的认识是这样的,所谓的面向对象就是在不懂内部原理的情况下,对它的一个使用。比如在我们的生活中,
去餐厅吃饭时,我们仅只给厨师报上菜名,厨师就会把菜做出来,不需要去告诉厨师要怎样去做,用什么做,这就是面向对象
。万物皆对象,对象就是由属性和方法组成的。面向对象有三大特征,分别是封装,继承和多肽。
面向对象面向的是class,面向的是类,而在我们js中是没有class没有类的,它基于的原型。创建对象的方法有很多种
,最常用的有6种,分别是字面式、new Object()、工厂方式、构造函数式还有原型链创建的对象,最后一种是混合式创建,
就是构造函数和工厂方式组合在一起创建出来的对象。创建好对象之后我们就可以往里面添加属性了,我们可以利用this来添
加属性,但是我们在使用原型链创建出来的对象就要用prototype这个属性去添加了。每个函数都有一个属性叫做prototype。
这个prototype的属性值是一个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。之后我们在创建好对象之
后,我们在调用对象的时候和其他的也是一样的new一个对象出来,这个对象的名称一旦使用,比如说var obj=new Object()
这个obj其实指向对象的内存地址的一个引用,引用可以调用对象里的属性和方法。
下面再来说一下js中面向对象的三大特征,封装,闭包是封装的最好体现,说起封装让我们不得不回想起变量,变量分为
全局变量和局部变量,全局变量比较简单,它可以在任何地方访问到,麻烦就麻烦在局部变量,局部变量一般在函数外是访问
不到的,这时候我们就可以用闭包了,我们在函数内部在来一个函数,这个函数称为二次函数,我们一般分为父函数和子函数
,子函数可以访问到父函数中的变量以及方法,我们称这个子函数为特权函数,闭包在我们的使用时应该尽量的少使用它,因
为它会占用内存,导致内存的泄漏,造成系统的崩溃,如果我们使用了的话,可以用标记清除或者引用计数的方法来清除。然
后就是继承,继承有三种方式 一种是原型链继承、另一种是构造函数式继承,最后一种是混合继承。我们刚才说过,子函数
可以访问到父函数的属性和方法,在原型链继承中,子对象有一个默认的属性叫__proto___,他指向的是这个方法的本身,而
这个方法的本身是不具有父方法的方法以及属性的,所以得调用它的prototype的属性,这个prototype属性又指向一个对象
,这个对象又是子方法的原型,那么这个原型他又是用父方法实例化出来的,所以又是他父对象的__proto__,这个__proto__
又指向的父对象本身那个prototype,这个prototype又调用他里面的属性和方法,这样的话就是他的原型链继承。构造函数式
继承最重要的一点就是冒充,父对象定义在子对象里面,在子对象里面可以引用父对象的属性和方法,在构造函数中有三个参数
需要注意一下,call apply aruments call和apply两种方法虽然都是继承属性,但书写格式存在不同这里call方法是通过this
后跟着一个字符串系列而apply方法同样也是通过this 不过传属性则是由数组构成,而argument中有两个属性分别是返回执行
函数本身的callee 还有一个形参的个数length,最后一种混合继承就比较简单了,就用构造和原型混用的方式来实现继承的。
最后一个特性是多肽就是一种食物的多种形态,允许将子类型的指针复制给父类类型的指针。
面向对象在实际中用来最多的是写插件、组件 写插件的一般步骤是定义一个原型,然后按照要求创建DOM元素,用原生或
js动态地去添加事件和方法,不过特殊事件要特殊处理,比如屏幕事件,屏幕的距离就要特殊处理,面向对象是一种通用思想
,并非只有编程中能用,在任何地方都可以用,面像对象提高了代码的复用性和可扩展性但是却降低了性能。
以上就是我对面向对象的理解,谢谢!