javascript必知必会:面象对象编程
面象对象编程技术的核心理念:封装、继承、多态;在一些主流的高级编程语言中,比如:C#,VB.NET,JAVA,PHP等都是很容易实现的,而如果要在javascript中实现面象对象编程,可就不那么直接和容易了,因为javascript并不是面向对象的语言,所以我们只能通过javascript的一些特性,比如:闭包、原型链等来模拟出面向对象编程,我认为这些是作为熟练掌握与灵活运用javascript的基础,园子里已有很多的javascript高手对于这方面都有介绍与分析,而我仅以作为一个项目负责人(独立设计与开发WEB前端与后端)的视角来重新理解javascript面向对象要点。
既然是面向对象,首先我们要知道如何创建一个对象,以下列出了创建对象的几种常见方法:
A.直接创建一个对象实例:
//直接实例化一个对象
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.先定义后实例化对象:
//先定义类,再实例化成对象
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方法来创建对象。
实现封装,即只暴露公共方法与公共属性,隐藏实现细节(私有方法、属性)
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);
利用原型链实现继承,即一个对象包含另一个对象的所有公共属性与方法,实现继承的方法有很多,我觉得采用如下形式来模拟继承更符合面向对象的思维:
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();
利用原型链实现多态,即基于同一个方法签名在不同的子类中表现的形式不同:
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必知必会:面象对象编程的更多相关文章
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
- 【EatBook】-NO.1.EatBook.1.JavaData.1.001-《JSON 必知必会-Introduction to JavaScript Object Notation》-
1.0.0 Summary Tittle:[EatBook]-NO.1.EatBook.1.JavaData.1.001-<JSON 必知必会-Introduction to JavaScrip ...
- django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询
from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...
- H5系列之History(必知必会)
H5系列之History(必知必会) 目录 概念 兼容性 属性 方法 H5方法 概念 理解History Api的使用方式 目的是为了解决哪些问题 作用:ajax获取数据时 ...
- H5系列之地理位置(必知必会)
H5之地理位置必知必会 [02]概念 规范地址:http://www.w3.org/TR/geolocation-API/ HTML5 Geolocation(地理定位)用于定位用 ...
- 第4节:Java基础 - 必知必会(中)
第4节:Java基础 - 必知必会(中) 本小节是Java基础篇章的第二小节,主要讲述抽象类与接口的区别,注解以及反射等知识点. 一.抽象类和接口有什么区别 抽象类和接口的主要区别可以总结如下: 抽象 ...
- 第3节:Java基础 - 必知必会(上)
第3节:Java基础 - 必知必会(上) 本篇是基础篇的第一小节,我们从最基础的java知识点开始学习.本节涉及的知识点包括面向对象的三大特征:封装,继承和多态,并且对常见且容易混淆的重要概念覆盖和重 ...
- Java面试必知必会(扩展)——Java基础
float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...
- 闻道Go语言,6月龄必知必会
大家好,我是马甲哥, 学习新知识, 我的策略是模仿-->归纳--->举一反三, 在同程倒腾Go语言一年有余,本次记录<闻道Go语言,6月龄必知必会>,形式是同我的主力语言C#做 ...
随机推荐
- 使用call来实现继承
function Class1(arg1,arg2) { this.name = arg1; this.pass = arg2; this.showSub = function() { return ...
- 更高效地提高redis client多线程操作的并发吞吐设计
Redis是一个非常高效的基于内存的NOSQL数据库,它提供非常高效的数据读写效能.在实际应用中往往是带宽和CLIENT库读写损耗过高导致无法更好地发挥出Redis更出色的能力.下面结合一些redis ...
- [转] 编译安装GCC
Linux下编写C/C++程序自然缺不了一个优秀的编译器,Linux下比较常见的自然是GCC了. 2015年GCC也出到了5.2.0版本,对于C++11/14也有了更好的支持了. 所以,今天我们就来说 ...
- google搜索技巧汇总
由于不能访问google,可访问ggso.in进行搜索. 简单整理记录一下常用的一些Google搜索技巧:或操作一般搜索时,如果输入多个词,默认是与的关系,如输入词1和词2,即搜索同时包含词1和词2的 ...
- 在VS2015 RC打开CTP中创建的工程
VS2015终于出了RC了!小伙伴们快来安装试用吧,地址在这里,还有新的Windows 10开发工具哦,要不然是开发不了Universal Windows App的,安装前记得卸载CTP版本. 新的R ...
- 每周一书-编写高质量代码:改善C程序代码的125个建议
首先说明,本周活动有效时间为2016年8月28日到2016年9月4日.本周为大家送出的书是由机械工业出版社出版,马伟编著的<编写高质量代码:改善C程序代码的125个建议>. 编辑推荐 10 ...
- comet在asp.net中的实现
网上有关“服务器推送”的介绍非常多,其中一种实现方式就是采用comet技术,在浏览器与服务端之间建立一个http协议的“长连接”,所谓“长连接”,就是指浏览器到服务端的http请求不会马上得到服务端的 ...
- 移动h5开发资源整理
这2年来,移动h5开发逐渐成为一种主流,也不断趋向于成熟.硬件和浏览器的不断更新,曾经的浏览器兼容也不再是开发者的噩梦. 接触h5开发一年多,从最初的新手到现在,陆陆续续遇到过很多坑.这里把想到的一些 ...
- Atitit dsl实现(1)------异常的库模式实现 异常的ast结构
Atitit dsl实现(1)------异常的库模式实现 异常的ast结构 1.1. Keyword 1 1.2. 异常的ast模型 1 1.3. Astview的jar org.eclipse. ...
- jQuery监听文本框值改变触发事件(propertychange)
完整代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w ...