响亮的标题:一个万能的,保底的。面向过程改写成面向对象的方法

前提朗读:很多刚接触js面向对象的时候都不知道如何能快速的写出一个面向对象的程序,这个是必然的现象,不是每一位学js的一上来就会写面向对象的程序。小编这里介绍的方法属于一个面向过程到面向对象的过度期间,(这里要明白面向对象的一些常识:构造函数创建出对象,对象.属性,对象.方法)

一:改写前提步骤:

  1.前提:面向过程中的所有代码都在window.onload 里面
  2.面向过程里面所有的函数都领到外面去(不能有函数嵌套)
  3.提出共同的变量为全局变量(可以有全局变量 当有两个以上的函数都用到了共同的一个变量的话--把这个变量提出来变成全局变量)

小总结4:替换过程(注意this的使用)

面向过程 面向对象
onload(初始化整个程序) 构造函数(初始化对象)
全局变量 属性(对象.属性)     this.属性
函数  方法(构造函数.原型.方法)    构造函数.prototype.方法

** 备注重点:
  改错:this,事件,闭包,传参
  重点:通过闭包传递this

**小编提示:

  面向对象中70%以上都会用到this这个关键字,所以要想使用好面向对象,必须弄明白this

二:案例展示:(不注重要是布局)

1.面向过程案例展示

<script>
window.onload=function ()
{
var oDiv=document.getElementById('div1'); //获取父级
var aBtn=oDiv.getElementsByTagName('input'); //获取oDiv下的所有的input
var aDiv=oDiv.getElementsByTagName('div'); //获取oDiv下的所有div
var i=0; //预先设置变量 i
//思路:清除所有的input元素上的class,并影藏对应的div。
//然后:添加当前点击的那个input的class。并显示对应的那个div for(i=0;i<aBtn.length;i++)
{
aBtn[i].index=i; //给每一个input元素新增加一个属性index
aBtn[i].onclick=function ()
{ //思路:先清除所有的input上面的class,并隐藏input对应的div
for(i=0;i<aBtn.length;i++)
{
aBtn[i].className='';
aDiv[i].style.display='none';
} //思路:然后给当前点击的那个input添加上class = active,并显示出input对应的那个div
this.className='active';
aDiv[this.index].style.display='block';
};
}
};
</script> <div id="div1">
<input class="active" type="button" value="教育" />
<input type="button" value="财经" />
<input type="button" value="aaa" />
<div style="display:block;">11111</div>
<div style="display:none">22222</div>
<div style="display:none">33333</div>
</div>

2.面向过程里面所有的函数都领到外面去(不能有函数嵌套)。提出共同的变量为全局变量

<script>
var aDiv = null; //声明全局变量
var aBtn = null; //声明全局变量 window.onload=function ()
{
var oDiv=document.getElementById('div1'); //获取父级
aBtn=oDiv.getElementsByTagName('input'); //获取oDiv下的所有的input
aDiv=oDiv.getElementsByTagName('div'); //获取oDiv下的所有div
var i=0; //预先设置变量 i
//思路:清除所有的input元素上的class,并影藏对应的div。
//然后:添加当前点击的那个input的class。并显示对应的那个div for(i=0;i<aBtn.length;i++)
{
aBtn[i].index=i; //给每一个input元素新增加一个属性index
aBtn[i].onclick=tab;
}
}; function tab(){
//思路:先清除所有的input上面的class,并隐藏input对应的div
for(i=0;i<aBtn.length;i++)
{
aBtn[i].className='';
aDiv[i].style.display='none';
} //思路:然后给当前点击的那个input添加上class = active,并显示出input对应的那个div
this.className='active';
aDiv[this.index].style.display='block';
};
</script> <div id="div1">
<input class="active" type="button" value="教育" />
<input type="button" value="财经" />
<input type="button" value="aaa" />
<div style="display:block;">11111</div>
<div style="display:none">22222</div>
<div style="display:none">33333</div>
</div>

3,this修改后

<script>
window.onload = function(){
var oTab = new TabSwitch('div1');
} function TabSwitch(id) //构造函数
{
var oDiv=document.getElementById(id); //获取父级
this.aBtn=oDiv.getElementsByTagName('input'); //获取oDiv下的所有的input
this.aDiv=oDiv.getElementsByTagName('div'); //获取oDiv下的所有div
var i=0; //预先设置变量 i
//思路:清除所有的input元素上的class,并影藏对应的div。
//然后:添加当前点击的那个input的class。并显示对应的那个div var _this = this; //this表示new出来的对象 for(i=0;i<this.aBtn.length;i++)
{
this.aBtn[i].index=i; //给每一个input元素新增加一个属性index
this.aBtn[i].onclick=function(){
_this.tab(this); // ** _this表示通过构造函数new出来的对象。 this表示调用事件onclick的对象--> 按钮input
} }
}; TabSwitch.prototype.tab = function(oBtn){
//思路:先清除所有的input上面的class,并隐藏input对应的div
for(i=0;i<this.aBtn.length;i++) //this表示通过构造函数new出来的对象
{
this.aBtn[i].className='';
this.aDiv[i].style.display='none';
} //思路:然后给当前点击的那个input添加上class = active,并显示出input对应的那个div
oBtn.className='active';
this.aDiv[oBtn.index].style.display='block';
};
</script> <div id="div1">
<input class="active" type="button" value="教育" />
<input type="button" value="财经" />
<input type="button" value="aaa" />
<div style="display:block;">11111</div>
<div style="display:none">22222</div>
<div style="display:none">33333</div>
</div>

咱使用this来讲2个面向对象的小案例:this啥时候会出问题。

  1:在定时器里面

  2:在事件里面(通过闭包的方式把this传过去)

面向对象this案例一(正常现象):

<script>
function Aaa(){
this.a = 55;
console.log(this) //表示new出来的对象
} Aaa.prototype.show = function (){
alert(this.a)
console.log(this) //表示new出来的对象
} var obj1 = new Aaa();
obj1.show(); // 55 </script>

面向对象this案例二(定时器里面的this):

<script>
function Aaa(){
this.a = 55;
setInterval(this.show, 3000); //this为 window 证明了定时器里面的this不正常为window
console.log(this) //构造函数对象
}
Aaa.prototype.show = function (){
alert(this) //表示为 window
}
var obj1 = new Aaa();
</script> 改进方法 <script>
function Aaa(){
this.a = 55;
var _this = this ; //this为构造函数的对象,然后赋给一个变量 _this
setInterval(function(){
_this.show(); //_this为 构造函数的对象
}, 3000);
console.log(this) //构造函数对象
} Aaa.prototype.show = function (){
alert(this) //构造函数的对象
}
var obj1 = new Aaa(); </script>

面向对象this案例三(事件里面的this):

<script>
function Aaa(){
this.a = 55;
document.getElementById('odiv1').onclick = this.show;
} Aaa.prototype.show = function(){
alert(this.a); //打印出:undefone 因为:this为 input按钮,但是input按钮上根本没有a这个属性,所以提示为undefine
console.log(this); // this为 input按钮
} window.onload = function(){
new Aaa();
}
</script> 改进后 <script>
function Aaa(){
this.a = 55;
var _this = this; // _this = this = 构造函数的对象 document.getElementById('odiv1').onclick =function(){
_this.show(); //_this 表示为构造函数的对象
}
} Aaa.prototype.show = function(){
alert(this.a); //55
} window.onload = function(){
new Aaa();
}
</script>
<input id="odiv1" type="button" value="按钮">

js面向过程改写成面向对象--通用方法的更多相关文章

  1. MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL

    [转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...

  2. C++基础——C面向过程与C++面向对象编程01_圆面积求解

    #include "iostream";//包含C++的头文件using namespace std;//使用命名空间std标准的命名空间(在这个命名空间中定义了很多标准定义)vo ...

  3. JS高级 - 面向对象3(面向过程改写面向对象)

    改写: 1.前提:所有东西都在 onload 里 2.改写:不能有函数嵌套,可以有全局变量 onload --> 构造函数 全局变量 --> 属性 函数 --> 方法 4.改错: t ...

  4. js绝对地址图片转换成base64的方法

    //将图片转换成base64 function getBase64Image(url, callback){ var canvas = document.createElement('canvas') ...

  5. js中字符串处理成数字的方法

    <script> var a="11.1111"; var b="12.2222"; //第一种方法:乘以1的方法 //alert(a*1+b*1) ...

  6. js面向过程-拖拽

    1.步骤分析: 1.1 获取id 1.2 当鼠标点击时执行的js 1.3当鼠标移动时执行的js 1.4当鼠标放开时执行的js 2.代码实现 <!DOCTYPE html> <html ...

  7. IDataReader转换成list通用方法

    public static IList<T> ReaderToList<T>(this IDataReader dr) { //DateTime dt = DateTime.N ...

  8. js面向过程-经典选项卡

    源代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  9. js 日期证有效性验的通用方法

    开发的理念是“为复用而开发,为使用而组装”,代码的复用度将是项目和产品的一个重要的技术指标. var DateTools={ isDate:function(str) { var result = s ...

随机推荐

  1. Linux环境下vsftpd参数配置

    很久之前就用过vsftpd,但总是忘了参数该如何配置,今天特地有搜索了一遍,把配置方法整理如下: (1)检查是否已安装vsftpd #rpm -qa | grep vsftpd vsftpd--.el ...

  2. http://www.dayandeng.com/ 诈骗网站

    http://www.dayandeng.com/ 诈骗网站   http://www.dayandeng.com/userfiles/media/2018/awzosv16.html   骗取你的京 ...

  3. Mac下关于——你不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效。文件的删除

    内容是google的,测试有效,因为用revel打包的东西删除以后有这个循环bug Mac下关于——你不能拷贝项目“”,因为它的名称太长或包括的字符在目的宗卷上无效.文件的删除 关于这个问题我找到的一 ...

  4. SQLServer数据库字典维护方法

    启用SQLServer启用管理器,以2008为例 1.设置表信息描述 选中要设置的表,右键点击“属性” . 选择扩展属性 填写要求: 名称:MS_Description 值: 模块名称-表名称 修改语 ...

  5. 进程间通信IPC之--共享内存

    每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲 ...

  6. SVN服务器几种备份策略---重点svnsync备份---OK

    配置管理的一个重要使命是保证数据的安全性,防止服务器应硬盘损坏.误操作造成数据无法恢复的灾难性后果.因此制定一个完整的备份策略非常重要. 一般来说,备份策略应规定如下几部分内容:备份频度.备份方式.备 ...

  7. 常​用​的​邮​箱​服​务​器​(​S​M​T​P​、​P​O​P​3​)​地​址​、​端​口

    常用的邮箱服务器(SMTP.POP3)地址.端口 gmail(google.com)  POP3服务器地址:pop.gmail.com(SSL启用 端口:995)  SMTP服务器地址:smtp.gm ...

  8. 【原】sql 将某列拼成一个字符串

    SQL Server中,写存储过程,时常会碰到这样一个需求:从某个表中取某一列,然后需要将这一列数据以某种形式拼成一个字符串,以供后面使用,下面这种方法能够实现此需求. --取说明书模块枚举,结果格式 ...

  9. ASP.NET运行机制原理

    ASP.NET运行机制原理 一.浏览器和服务器的交互原理 (一).浏览器和服务器交互的简单描述: 1.通俗描述:我们平时通过浏览器来访问网站,其实就相当于你通过浏览器去另一台电脑上访问文件一样,只不过 ...

  10. Maven打包web工程成WAR

    其实不一定要通过Goals:package来打war包,直接run as maven bulid也行: