javascript的面向对象编程
面象对象编程技术的核心理念:封装、继承、多态;在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接和容易了,因为javascript并不是面向对象的语言,所以我们只能通过javascript的一些特性,比如:闭包、原型链等来模拟出面向对象编程,我认为这些是作为熟练掌握与灵活运用javascript的基础,园子里已有很多的javascript高手对于这方面都有介绍与分析,而我仅以作为一个项目负责人(独立设计与开发WEB前端与后端)的视角来重新理解javascript面向对象要点。
既然是面向对象,首先我们要知道如何创建一个对象,以下列出了创建对象的几种常见方法:
A.直接创建一个对象实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//直接实例化一个对象 var Person1 = { Name: "梦在旅途" , Age: 29, Sex: "男" , Height: 178 }; alert(Person1.Name); var Person2 = new Object(); Person2.Name = "梦在旅途" ; Person2.Age = 29; Person2.Sex = "男" ; Person2.Height = 178; alert(Person2.Name); //这个是上面的简写 var Person3 = new Object({ Name: "梦在旅途" , Age: 29, Sex: "男" , Height: 178 }); alert(Person3.Name); |
优点:直接创建一个对象,无需提前定义类型;
缺点:无法实现复用;
B.先定义后实例化对象:
1
2
3
4
5
6
7
8
9
10
|
//先定义类,再实例化成对象 function Person4(n,a,s,h) { this .Name = n; this .Age = a; this .Sex = s; this .Height = h; } var p4 = new Person4( "梦在旅途" , 29, "男" , 178); alert(p4.Age); |
优点:类似面向对象编程语言的构造函数,容易理解,且定义后可通过new关键字实例化多个对象,实现复用。
缺点:需先定义后才能实例化;
综上所述,建议采用B方法来创建对象。
实现封装,即只暴露公共方法与公共属性,隐藏实现细节(私有方法、属性)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
function Person5(n, a, s, h) { //公共属性 this .Name = n; this .Age = a; this .Sex = s; this .Height = h; //公共方法 this .AfterYear = function (count) { updateAge(count); alert(_currentYear + "后,我已经:" + this .Age + "岁了!" ); }; this .Say = function () { alert( "我的个人信息--> Name: " + this .Name+ ", Age: " + this .Age + ", Sex: " + this .Sex + ", Height:" + this .Height); } //私有属性与方法 var _self = this ; var _currentYear = 2015; function updateAge(count) { _currentYear += count; _self.Age += count; }; } var p5 = new Person5( "梦在旅途" , 29, "男" , 178); p5.AfterYear(10); p5.AfterYear(25); |
利用原型链实现继承,即一个对象包含另一个对象的所有公共属性与方法,实现继承的方法有很多,我觉得采用如下形式来模拟继承更符合面向对象的思维:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function SoftEngineer(n, a, s, h, lang) { Person5.call( this , n, a, s, h); //将Person5的所有属性与方法包含到SoftEngineer中,从而实现继承 this .Lang = lang; this .SayCode = function () { alert( "我是一名软件工程师,我会" + this .Lang + "编程语言!" ); } this .Working = function () { }; //空方法,类似面向对象中的虚方法 } SoftEngineer.prototype = new Person5(); //将SoftEngineer的原型指定Person5的实例 var softengr = new SoftEngineer( "梦在旅途" , 29, "男" , 178, "javascript" ); softengr.Say(); softengr.SayCode(); |
利用原型链实现多态,即基于同一个方法签名在不同的子类中表现的形式不同:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
function WebSoftEngineer(n, a, s, h, lang) { SoftEngineer.apply( this , [n, a, s, h, lang]); this .Working = function () { alert( "我是网页工程师,从事网页开发设计工作!" ); }; }; WebSoftEngineer.prototype = new SoftEngineer(); function AppSoftEngineer(n, a, s, h, lang) { SoftEngineer.apply( this , [n, a, s, h, lang]); this .Working = function () { alert( "我是应用工程师,从事客户端应用程序开发设计工作!" ); }; }; AppSoftEngineer.prototype = new SoftEngineer(); var webengr = new WebSoftEngineer( "梦在旅途" , 29, "男" , 178, "javascript" ); webengr.Say(); webengr.Working(); var appengr = new AppSoftEngineer( "梦在旅途" , 29, "男" , 178, "c#" ); appengr.Say(); appengr.Working(); |
javascript的面向对象编程的更多相关文章
- JavaScript的面向对象编程(OOP)(一)——类
在学习JavaScript面向对象的编程之前,需要知道,并了解面向对象的一些基本的常识.初学者中大多数都以为面向对象中,面向对象的编程是很重要和占据很大一部分精力.笔者在之前也是认为OOP是面向对象的 ...
- Javascript 进阶 面向对象编程 继承的一个样例
Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承.这篇使用一个样例来展示js怎样面向对象编程.以及怎样基于类实现继承. 1. ...
- Javascript 进阶 面向对象编程 继承的一个例子
Javascript的难点就是面向对象编程,上一篇介绍了Javascript的两种继承方式:Javascript 进阶 继承,这篇使用一个例子来展示js如何面向对象编程,以及如何基于类实现继承. 1. ...
- JavaScript的面向对象编程(OOP)(三)——聚合
之前写过了类和原型,这里再说聚合,在写关于聚合之前,对与继承我再总结一下.JavaScript中关于继承的方式一共有三种,之前写了两种,但是没有说明,这里补充说明一下. 1.类式继承:通过在函数对象内 ...
- JavaScript的面向对象编程(OOP)(二)——原型
关于JavaScript的原型模式,下面的是学习后的个人理解,若是有偏差,还请指出,谢谢 JavaScript原型模式 1.什么是原型? 原型是一个对象,其他的对象可以通过它实现属性的继承,所有的对象 ...
- JavaScript基础-面向对象编程<2>
2.动态添加,修改和删除对象属性和方法 例如:用类Object()创建一个空对象user,然后修改其行为. (1) 添加属性 var user=new Object(); //创建一个没有属性和方法的 ...
- JavaScript基础-面向对象编程<1>
1.1 函数与对象 1.定义函数的方式定义类 定义类的方法: function class1(){ //类成员的定义及构造函数部分 } class1既是一个函数,也是一个类. 使用 new 操作符获 ...
- javascript OOP 面向对象编程
Pseudo-class declaration 原文地址:http://javascript.info/tutorial/pseudo-classical-pattern#pseudo-class- ...
- javascript 仿面向对象编程实例代码(私有,公共变量。。。)
//定义一个javascript类 function JsClass(privateParam,publicParam){//构造函数 var priMember = privateParam; // ...
随机推荐
- message 匹配不上grok正则 也会写入到elasticsearch
{ "message" => "scan test 20161201", "@version" => "1" ...
- C#功能扩张方式
有时候,为了完成一些window的一些操作,需要引入一些dll进行操作 1) 引入系统api进行操作,形如[DllImport("urlmon.dll", CharSet = C ...
- Automatic Code Generation-->Implement Interface
https://msdn.microsoft.com/en-us/library/hk90416s(v=vs.110).aspx VS中自带的只能提示,一个类继承自某一个接口. 由VS为类生成接口所要 ...
- bzoj1179
这种tarjan+dp的水题我竟然还WA了两次,要小心! type link=^node; node=record po:longint; next:link; ...
- 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库
发布于 2014-02-10 作者 陈 忠岳 持续集成 (CI) 的历史源远流长, 其宗旨在于软件团队在敏捷环境中不断将他们的工作整合为持续构建.管理 CI 进程的工具已存在一段时间.过去几年中 ...
- 推荐一款自己的软件作品[豆约翰博客备份专家],新浪博客,QQ空间,CSDN,cnblogs博客备份,导出CHM,PDF(转载)
推荐一款自己的软件作品[豆约翰博客备份专 豆约翰博客备份专家是完全免费,功能强大的博客备份工具,博客电子书(PDF,CHM和TXT)生成工具,博文离线浏览工具,软件界面美观大方,支持多个主流博客网站( ...
- bzoj 4016 [FJOI2014]最短路径树问题(最短路径树+树分治)
4016: [FJOI2014]最短路径树问题 Time Limit: 5 Sec Memory Limit: 512 MBSubmit: 426 Solved: 147[Submit][Stat ...
- C语言调用汇编实现字符串对换
1. 前面配置arm交叉编译环境. 2. 配置好qemu-arm C语言代码string-switch.c: #include <stdio.h> #include <stdlib. ...
- Linux操作系统的LILO详解
LILO是一个在Linux环境编写的Boot Loader程序(所以安装和配置它都要在Linux下).它的主要功能就是引导Linux操作系统的启动.但是它不仅可以引导Linux,它还可以引导其他操作系 ...
- MD5是什么,怎么用着怪怪的
写作目的 通常我们在使用加密算法时,都是直接调用一个方法,比如Base64,直接把待加密的字符串给加密好了.对于某些使用公私钥的算法,最多再传入一段公钥即可.但是在使用MD5算法的时候,总是需要用到一 ...