JavaScript的面向对象编程(OOP)(一)——类

  在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识。初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力。笔者在之前也是认为OOP是面向对象的主要部分,那么和我持有一样想法的,下面先要纠正这一想法,真正了解面向对象。

一、初识面向对象

面向对象分为三部分,包括面向对象分析(OOA)、面向对象设计(OOD)、面向对象的程序设计(OOP)。

1.1 OO编程(Object Oriented Analysis)

  典型的OO编程过程,应先整理需求,根据需求进行OOA,将真实世界的客观物件抽象成程序中的类或对象,这个时候使用的是UML语言,UML建模,OOA的输出结果是一个个类或对象的模型图。

接下的OOD,目的是处理类之间的耦合关系,设计类或对象的接口,此时会用到各种设计模式(23种设计模式),如观察者模式,责任链模式等等(之后会写一些JavaScript常用的设计模式)。 OOA和OOD是个反复迭代的过程,它们本身没有很清晰的边界,但是相互影响、制约。 OOA和OOD结束之后才进入OOP阶段,进入实际的编码阶段。 OOA和OOD是面向对象编程的思想和具体语言无关,而OOP是面向对象的编程工具,和选用的语言相关。

OOA和OOD因为具体要求与语言无关,所以能跨语言重用。而OOP作为二者的底层,不同的语言语法不同,所以OOP不同。

  通过简单的了解,我们所要学习的OOP编程只是面向对象里最简单的代码部分,下面我把我学习的面向对象的一些知识总结一下,理解不深,如有错误,还请订正

二、JavaScript的面向对象编程——类

(1)类的定义

在JavaScript中我们利用functions来定义一个类

1 function Shape(){
2         var x = 1;
3         var y = 2
4     }

这是一个简单的类,在类的内部只有var定义的私有变量,我们通过new关键字可以实例化一个对象 var aShape = new Shape(); ,这样我们就实例化出了一个对象实例,aShape。但是类中定义的是私有变量,我们通过 aShape.x 和 aShape.y 访问,发现程序弹出undefined。

下面我们重新定义一个类并测试

function Shape2(){
    this.x = 1;
    this.y = 2;
    }
var bShape = new Shape2();       //初始化一个实例对象
alert(bShape.x);
alert(bShape.y);                      //分别弹出1和2

我们在类中用this.属性名的方式定义公有变量,并且能访问成功。var除了定义私有变量,还能定义私有函数(private函数)

function Shape3(){
           var draw = function(){
           //私有函数
        }
            this.draw2 = function(){
          //外界可以看到的共有函数
        }
}    

和访问变量类似,先实例化 var c = new Shape3(); 然后再通过 c.draw2(); 访问。

(2)简单的OOP编程

JavaScript是一门解释型的语言,它并不是真正的面向对象的语言,很多面向对象的机制是需要靠模仿来实现的。

 1 //模仿OOP编程
 2 function Shape4(m,n){
 3         var x = 0;
 4         var y = 0;
 5 //创建一个内部的初始化函数,并执行
 6         var init = function(){
 7             x = m;
 8             y = n;
 9         }
10         init();
11 //写一个get方法,取出我们传入的x值
12         this.getX = function(){
13             return x;
14         }
15     }

简单的一个模仿OOP编程,我们通过 var obj = new Shape4(2,4); 实例化一个obj,并传入2,4两个参数,在通过 obj.getX(); 得到我们传入的x参数,得到2。

下面我们来模仿OOP编程的构造函数,需要注意的是JS中静态方法是作用到类上,而不是对象上的。

 1 function Person(){
 2       this.Name = "yanyan"
 3 };
 4 Person.age = 0;//静态变量
 5 //静态方法
 6 Person.showName = function(obj){
 7           alert(obj.Name)
 8 }9 Person.showName(new Person());

(3)Map

JavaScript中不存在Map类型(键值对的集合)的数据,下面我们简单的模仿出Map类型

 1         function jMap(){
 2                 //私有变量
 3                 var arr = { };
 4                 //增加
 5                 this.put = function(key,value){
 6                     arr[key] = value;
 7                 }
 8                 //查询
 9                 this.get = function(key){
10                     if(arr[key]){
11                         return arr[key]
12                     }else {
13                         return null;
14                     }
15                 }
16                 //删除
17                 this.remove = function(key){
18                     delete  arr[key]
19                 }
20                 //遍历
21                 this.eachMap = function(fn){
22                     for (var key in arr){
23                         fn(key,arr[key])
24                     }
25                 }
26             }
27             var country = new jMap();
28             country.put("01","value1");
29             country.put("02","value2");
30             country.put("03","value3");
31             country.put("04","value4");
32             alert(country.get("04"));//读取key为04的值
33             country.remove("04");//删除刚才读到的值
34             alert(country.get("04"));//此时弹窗为null
35
36             //遍历读取
37             country.eachMap(function(key,value){
38               document.write(key+"-->"+value+"<br />");
39             })        

通过 var country = new jMap(); 实例化出了一个jMap对象,并通过put方法添加了四个键值的集合,此时jMap()作为类,我们可以通过new方法实例化出Map类型的数据。

时间: 2025-01-15 06:10:58

JavaScript的面向对象编程(OOP)(一)——类的相关文章

2016/1/17 笔记 1,面向对象编程OOP 2,类

面向对象编程OOP 编程方式的发展 1,面向过程 重用性低 维护工作量大  2,面向对象 重用性高 维护容易 概念 1,对象 Object 一个具体的事物 是类的实例      2,类Class 同一类事物的统称 具有相同属性和行为的一类实体 特性:1,封装:  oop的核心思想           封装属性和行为,隐藏细节           保证内部数据完整性        2,继承: 子类自动继承所有父类的属性和行为           java是单继承 所有类的父类Object     

学习面向对象编程OOP 第一天

面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个程序单元可以拼凑成一个完整的功能程序; 3.三个目标:重用性.灵活性和扩展性; 4.每个单独的对象或者单元都可以实现数据的接收.处理和发送; 5.在实际的项目开发中,都会使用达到OOP去声明类,而且在项目里面只用对象和类. 详细参考网址(根据原文学习的) http://www.cnblogs.com

Python笔记5#面向对象编程OOP

▲面向对象编程OOP Object Oriented Programming.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递. 在Python

24 Python - 面向对象编程OOP

面向对象编程OOP 01内容回顾 02属性@property本质是函数 未用属性前内容 使用属性后内容 @property  属性本质是函数,但是用起来像字段 03继承.多态示例 继承通过下面的一个基类 和一个派生类讲解 里面用到了继承和多态 [基类] [派生类] [函数调用] 04类嵌套如Employee引用Department 注意:在Employee的init()的参数中用department:Department来说明department是一个类,这样写有利于代码可读性 调用 原文地址:

23 Python - 面向对象编程OOP

面向对象编程OOP 01 方法__repr__()和__str__() __repr__()方法类似java中的toString方法,用于反馈类的相关信息且可以自己定义,一般用于开发人员控制台调试 __rept__()和__str__()方法区别 在控制台交互测试时: 输入b返回__rept__()方法结果 输入print(b) 返回__str__()方法结果,如果没有定义__str__()方法  则用__rept__()结果代替__str__()方法结果 __rept__()   打印信息一般

C++ Primer 学习笔记_66_面向对象编程 --定义基类和派生类[续]

算法旨在用尽可能简单的思路解决问题,理解算法也应该是一个越看越简单的过程,当你看到算法里的一串概念,或者一大坨代码,第一感觉是复杂,此时不妨从例子入手,通过一个简单的例子,并编程实现,这个过程其实就可以理解清楚算法里的最重要的思想,之后扩展,对算法的引理或者更复杂的情况,对算法进行改进.最后,再考虑时间和空间复杂度的问题. 了解这个算法是源于在Network Alignment问题中,图论算法用得比较多,而对于alignment,特别是pairwise alignment, 又经常遇到maxim

面向过程编程(OPP) 和面向对象编程(OOP)的关系

面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和面向对象的编程(OOP),给出这它们的定义的人很多,您可以从任何资料中找到很专业的解释,但以我的经验来看,讲的相对枯燥一点,不是很直观.除非您已经有了相当的积累,否则说起来还是比较费劲. 我是个老程序员出身,虽然现在的日常工作更多倾向了管理,但至今依然保持编码的习惯,这句话什么意思呢?我跟大家沟通应

[.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要

C++笔记:面向对象编程(Handle类)

句柄类 句柄类的出现是为了解决用户使用指针时需要控制指针的加载和释放的问题.用指针访问对象很容易出现悬垂指针或者内存泄漏的问题. 为了解决这些问题,有许多方法可以使用,句柄类就是其中之一.句柄类是一种包装类,用于存储和管理基类的对象指针,减轻用户使用对象的负担.句柄类使用指针执行操作,虚成员由于既可以指向基类型又可以指向派生类型,所以其行为将在运行时根据句柄实际绑定的对象而变化. 句柄类的设计有两个重要的考虑因素: 必须确定复制控制 是否屏蔽继承层次(不屏蔽用户需要了解基类对象的使用) 指针型句