我对面向对象的深刻理解

我们之前已经对对象有所了解了,现在我们来说一下面向对象。

我对面向对象的认识是这样的,所谓的面向对象就是在不懂内部原理的情况下,对它的一个使用。比如在我们的生活中,

去餐厅吃饭时,我们仅只给厨师报上菜名,厨师就会把菜做出来,不需要去告诉厨师要怎样去做,用什么做,这就是面向对象

。万物皆对象,对象就是由属性和方法组成的。面向对象有三大特征,分别是封装,继承和多肽。

面向对象面向的是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动态地去添加事件和方法,不过特殊事件要特殊处理,比如屏幕事件,屏幕的距离就要特殊处理,面向对象是一种通用思想

,并非只有编程中能用,在任何地方都可以用,面像对象提高了代码的复用性和可扩展性但是却降低了性能。

以上就是我对面向对象的理解,谢谢!

时间: 2024-10-17 01:18:24

我对面向对象的深刻理解的相关文章

面向对象的深刻理解

对象没有继承元类的dict的值 init 对象点dict的值就是实例化对象的名称空间 类点dict就是类的名称空间 new 是没有dict这个字典的,只会在args中赋值 call 是在对象加括号调用的时候触发,没有dict这个字典, 对象继承了元类 元类中的init方法 args 中的参数就是 继承元类的类的属性 类的名字.类的基类.类的名称空间.注意类的名称空间是没有实例化属性的属性值得,还有一个init的self就是就是这个类的实例化对象 元类中的new方法 args 中的参数就是 继承元

深刻理解JavaScript基于原型的面向对象

主题一.原型 一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  "原型对象"是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性. 3 除了语言原生的顶级对象,每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统.root节点的顶层对象是一个语言原生的对象,其他所有对象都直接或间接继承它的属性. 显然,基于原型的语言比基于类的语言简单得多,我

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

深刻理解Nginx之Nginx完整安装

1.   Nginx安装 1.1预先准备 CentOS系统下,安装Nginx的库包依赖.安装命令如下: sudo yum groupinstall "DevelopmentTools" sudo yum install pcre pcre-devel sudo yum install zlib zlib-devel yum install perl-ExtUtils-Embed sudo yum install openssl openssl-devel 1.2 安装 最重要的特性和基

深刻理解Nginx之Nginx与Python(1)

6 Python和Nginx 6.1 介绍FastCGI FastCGI(Fast Common Gateway Interface)是基于CGI上的改进,是CGI的一种演变产物.尽管目的是保持相同的,FastCGI在CGI上提供了重大的提升,通过建立起下面的原则. l  代替对于每个请求孵化一个新进程,FastCGI采用持久化进程,伴随着能够处理多个请求的能力. l  Web服务器和网关应用程序通过使用sockets比如TCP或者POSIXT 本地IPC sockets来交流.其结果是,它们的

深刻理解Docker镜像大小

都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处女容器.镜像的基石作用已经非常明显.在Docker的世界里,能够说是:No Image,No Container. 再进一步思考Docker镜像,大家可能非常快就会联想到下面几类镜像: 1.系统级镜像:如Ubuntu镜像.CentOS镜像以及Debian容器等: 2.工具栈镜像:如Golang镜像.

面向过程和面向对象的本质理解

http://kiritor.blog.51cto.com/7400479/1226762/ 面向过程和面向对象的本质理解 面向过程就是分析出解决问题所需的步骤,面向对象则是把构成问题的事物分解成对象,抽象 出对象的目的并不在于完成某个步骤,而是描述其再整个解决问题的步骤中的行为. 面向过程的思维方式是分析综合,面向对象的思维方式是构造. 例如c语言解决问题时,一般是先定义数据结构,然后在构造算法.而是用Java面向对象求解时 则是先抽象出对象,构造一个"封闭"的环境,这个环境中有定义

深刻理解Java中形参与实参,引用与对象的关系

声明:本博客为原创博客,未经允许,不得转载!原文链接为http://blog.csdn.net/bettarwang/article/details/30989755 我们都知道,在Java中,除了基本数据类型之外,其他的都是引用类型,当它们作为函数参数时,传递的也是引用,通过引用可以改变对象的值,很多人便因此而忽略形参与实参,引用与对象的关系问题.废话不多说,先看下面一个例子: import java.util.*; public class Student { private String

parent,son深刻理解this,super关键字

核心点: super关键字,表示调用的是父类对象. this关键字,表示调用的是当前运行类对象. 那么如果在父类中,使用了关键字,this,此时的this指的是什么呢? 看下面的例子,再加深理解核心店的第二句话就ok了. parent类: package com.ghsy.thissuper; public class Parent { public void init(){ System.out.println(this.getClass()); //获得当前运行类 System.out.pr