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面向对象编程
摘要:本文本来是想自己写的,奈何花了好长时间写好之后忘记保存,还按了刷新键,一键回到解放前,索性不写了,所以本文是转载的. 面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式,主要包括模块化. ...
随机推荐
- kotlin学习(6)运算符重载和其他约定
约定 在Kotlin中,可以调用自己代码中定义的函数,来实现语言结构.这戏功能与特定的函数命名相关,例如,在你的类中定义了一个名为plus的特殊方法,那么按照约定,就可以在该类的实例上使用 + 运算符 ...
- RESTful API 设计总结
RESTful API 设计总结 @(技术-架构)[API, 规范, 设计] RESTful的接口设计风格应用的越来越广泛,包括Spring Cloud等微服务架构平台之间的调用都是以RESTful设 ...
- B/S,C/S架构的区别
B/S架构:browser/server,采用的是浏览器服务器模式. C/S架构:client/server,采用的是客户端服务器模式. B/S架构,客户端是浏览器基本不需要维护,只需要维护升级服务器 ...
- MongoDB的使用学习之(四)权限设置--用户名、密码、端口==
本文参照:http://hi.baidu.com/tianhuimin/item/590d96cfd7ac1509c610b26a 本人也是按照此文章操作的,但是有些不妥,红色文字就是我实践后,需要改 ...
- jquery.lazyload (JS懒加载框架使用详解)
/** 本地加载方式加载JS*/ NSString *path = [[NSBundle mainBundle] pathForResource:@"jquery.js&quo ...
- wpf textbox ctrl+enter事件
<TextBox x:Name="xcontent" Text="sfasdf" Grid.Row="0" AcceptsReturn ...
- git上传代码到code.csdn.net
国内有code.csdn.net速度很快 用git上传需要去下载git程序 很简单. 我是Windows下 先code.csdn.net创建一个项目 https://code.csdn.net/das ...
- C功能模块集锦
1. offsetof #include <stddef.h> size_t offsetof(type, member); The macro offsetof() returns th ...
- mongo配置
cmd下操作 cd /d E:\MongoDB\bin 创建数据库: mongod --dbpath E:\MongoDB\data\db 验证是否成功,登陆localhost:27017 进入E:\ ...
- C#索引器3 重载
7.索引器 重载 public class Demo { private Hashtable name = new Hashtable(); public string this[int index ...