day58—JavaScript面向对象(一)
转行学开发,代码100天——2018-05-13
“面向对象”对于学习过C++及JAVA的开发者来说并不陌生。有意思的是面向对象的思路可以用于面对或解决生活工作中的其他问题,简单地说就是“只关注功能,不注重细节”。
产品上:只注重某模块的功能及接口,多个模块对象组合最终满足我的总体要求即可。
管理上:对于项目负责人进行进度跟踪,具体执行工作由负责人具体安排和部署。
...这里多多少少都有些面向对象的意思。
言归正传。JavaScript中的面向对象。
如:下面的一段程序代码中,通过工厂模式创建并使用对象。
<script type="text/javascript">
function CreatePerson(name,qq)
{
var obj = new Object();
obj.name =name;
obj.qq = qq;
obj.showName = function()
{
alert('我的名字叫:'+this.name);
}
obj.showQQ = function()
{
alert('我的QQ是:'+this.qq);
}
return obj;
} //对象
var obj1 = CreatePerson("allen","123558");
obj1.showName();
obj1.showQQ();
var obj2 = CreatePerson("tom","8151875");
obj2.showName();
obj2.showQQ();
</script>
这里我们可以注意到我们的基本功能得到了实现,但是细想之下。这里依然存在一些问题。
问题1:不符合习惯的new方式。
new 对象 的对象创建方式有两个功能特点:
1 创建对象
2 返回对象
因此可以对上述的对象创建过程进行优化
<script type="text/javascript">
function CreatePerson(name,qq)
{
var obj = new Object();
this.name =name;
this.qq = qq;
this.showName = function()
{
alert('我的名字叫:'+this.name);
}
this.showQQ = function()
{
alert('我的QQ是:'+this.qq);
}
// return obj;
} //对象
var obj1 = new CreatePerson("allen","123558");
obj1.showName();
obj1.showQQ();
var obj2 = new CreatePerson("tom","8151875");
obj2.showName();
obj2.showQQ();
alert(obj1.showName==obj2.showName);
</script>
问题2:上述代码中
alert(obj1.showName==obj2.showName); 返回值均为false
也是说,showName()与showQQ()方法会随着对象创建而创建,且每个均不同。这就造成了资源的消耗和浪费。
解决这个问题的方式是将方法不再与对象绑定,而是添加到原型上。
function CreatePerson(name,qq) //构造函数
{
var obj = new Object();
this.name = name;
this.qq = qq;
} CreatePerson.prototype.showName = function(){
alert('我的名字是:'+this.name);
}
CreatePerson.prototype.showQQ =function(){
alert('我的QQ是:'+this.qq);
} var obj1 = new CreatePerson('allen','123558');
obj1.showName();
obj1.showQQ();
var obj2 = new CreatePerson('tom','8151875');
obj2.showName();
obj2.showQQ(); alert(obj1.showName==obj2.showName); </script>
此时 alert(obj1.showName==obj2.showName);返回值为true,及说明虽然创建了两个对象,但是没有改变原型函数。 因此,上述的优化表现在:在构造函数上添加属性,在原型上添加方法。这种创建对象的方式又称混合方式创建对象。
最后,举一个应用的实例——面向对象的选项卡
<!DOCTYPE html>
<html>
<head>
<title>面向过程的选项卡</title>
<style type="text/css">
#div1 input{background: white; }
#div1 input.active{background: yellow;}
#div1 div{width: 200px; height: 200px;background: #ccc;display: none;}
</style> <script type="text/javascript">
window.onload = function()
{
new TabSwitch("div1");
}; function TabSwitch(id){
var _this = this;
var oDiv = document.getElementById(id);
this.aBtn = oDiv.getElementsByTagName("input");
this.aDiv = oDiv.getElementsByTagName("div");
for (var i = 0; i < this.aBtn.length; i++) {
this.aBtn[i].index = i;
this.aBtn[i].onclick = function()
{
_this.fnClick(this);
}
}
} //选项卡点击 TabSwitch.prototype.fnClick = function(oBtn)
{
for (var i = 0; i <this.aBtn.length; i++) {
this.aBtn[i].className ='';
this.aDiv[i].style.display ='none';
}
oBtn.className='active';
this.aDiv[oBtn.index].style.display ='block';
};
</script>
</head>
<body>
<div id="div1">
<input class="active" type="button" value="aaa">
<input type="button" value="bbb">
<input type="button" value="ccc">
<div style="display: block;">aaaafds</div>
<div>bbdsvsvvb</div>
<div>ccsvsavc</div>
</div>
</body>
</html>



至此,逐步体验了通过面向过程到面向对象的转变,面向对象的一个特点在于:
1.对象中不能有函数套函数,可以有全局变量
2.代码方式改变:
onload ->构造函数
全局变量->属性
函数->方法
day58—JavaScript面向对象(一)的更多相关文章
- JavaScript学习笔记(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- JavaScript学习总结(三)——this、原型、javascript面向对象
一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- javascript面向对象系列第四篇——选项卡的实现
前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...
- javascript面向对象系列第三篇——实现继承的3种形式
× 目录 [1]原型继承 [2]伪类继承 [3]组合继承 前面的话 学习如何创建对象是理解面向对象编程的第一步,第二步是理解继承.本文是javascript面向对象系列第三篇——实现继承的3种形式 [ ...
- javascript面向对象系列第一篇——构造函数和原型对象
× 目录 [1]构造函数 [2]原型对象 [3]总结 前面的话 一般地,javascript使用构造函数和原型对象来进行面向对象编程,它们的表现与其他面向对象编程语言中的类相似又不同.本文将详细介绍如 ...
- Javascript面向对象(封装、继承)
Javascript 面向对象编程(一):封装 作者:阮一峰 Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程( ...
- 《javascript面向对象精要》读书笔记
<javascript面向对象精要> 买这本书的原因主要是因为作者,Nicholas C. Zakas 牛X闪闪的js专家,读过js高程的应该都知道他,而这本书是他的最新力作,感觉也是js ...
- 【转】javascript面向对象编程
摘要:本文本来是想自己写的,奈何花了好长时间写好之后忘记保存,还按了刷新键,一键回到解放前,索性不写了,所以本文是转载的. 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式,主要包括模块化. ...
随机推荐
- Java关于继承中的内存分配
1.定义 super:当前对象的父类对象 this :当前对象,谁调用this所在的方法,this就是哪一个对象. 2.内存分析 另一个例子: public s ...
- bzoj4103 [Thu Summer Camp 2015]异或运算(可持久化trie)
内存限制:512 MiB 时间限制:1000 ms 题目描述 给定长度为n的数列X={x1,x2,...,xn}和长度为m的数列Y={y1,y2,...,ym},令矩阵A中第i行第j列的值Aij=xi ...
- ModelForm操作
ModelForm a. class Meta: model, # 对应Model的 fields=None, # 字段 exclude=None, # 排除字段 labels=None, # 提示信 ...
- mysql复习(1)基本CRUD操作
一.这段时间在学校,把之前的东西都好好捡起来. 0.下面介绍Mysql的最基本的增删改查操作,很多IT工作者都必须掌握的命令,也是IT面试最常考的知识点.在进行增删改查之前,先建立一个包含数据表use ...
- POI读取文件的最佳实践
POI是 Apache 旗下一款读写微软家文档声名显赫的类库.应该很多人在做报表的导出,或者创建 word 文档以及读取之类的都是用过 POI.POI 也的确对于这些操作带来很大的便利性.我最近做的一 ...
- Ubuntu18 给terminal改个漂亮的命令行提示符
重新安装了VMware和Ubuntu,但是命令行提示符太单调,不美观,如何更改呢.于是在网上巴拉巴拉搜寻一番. 1.更改PS1环境变量,这俩都可以,我选择第一个: export PS1="\ ...
- 基于ldap+sentry+rbac的hive数据库权限测试
1.rbac系统简介 2.sentry系统简介 3.ldap系统简介 4.整个待测系统简介 user-role=group-role user-role是用户在rbac系统创建项目以及把项目成员以及给 ...
- pandas处理字符串
# pandas 字符串的处理 # 前面已经学习了字符串的处理函数 # df["bWendu"].str.replace("℃","").a ...
- C#基础知识之dnSpy反编译
dnSpy工具可以在网上自行下载 软件界面如下: 现在进入话题,首先编写一个Hello World的控制台运行程序,如下图所示: 代码如下: using System; using System.Co ...
- git log 详解 以及代码量统计
https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86% ...