通过按住鼠标拖动的例子来演示面向对象的过程

css部分

#box1{
width: 100px;
height: 100px;
background: #f00;
position: absolute;
left: 0;
top:0;
}

HTML部分

<div id="box1"></div>

JS部分

// 面向过程1
// 写出实现逻辑
// var oBox = document.getElementById('box1');

// oBox.onmousedown = function(e){
// var ev = e || window.event;
// ev.stopPropagation();
// var distX = ev.clientX-this.offsetLeft;
// var distY = ev.clientY-this.offsetTop;

// document.onmousemove = function(e){
// var ev = e || window.event;
// ev.stopPropagation();
// var newX = ev.clientX;
// var newY = ev.clientY;
// oBox.style.left = newX-distX+"px";
// oBox.style.top = newY-distY+"px";
// }
// document.onmouseup = function(){
// this.onmousedown = null;
// this.onmousemove = null;
// }
// }

// 面向过程2
// 写成函数形式
// window.onload = function(){
// oBox = document.getElementById('box1');
// oBox.onmousedown = fnDown;
// }

// function fnDown(e){
// var ev = e || window.event;
// ev.stopPropagation();
// distX = ev.clientX-this.offsetLeft;
// distY = ev.clientY-this.offsetTop;
// document.onmousemove = fnMove;
// document.onmouseup = fnUp;
// }
// function fnMove(e){
// var ev = e || window.event;
// ev.stopPropagation();
// var newX = ev.clientX;
// var newY = ev.clientY;
// oBox.style.left = newX-distX+"px";
// oBox.style.top = newY-distY+"px";
// }
// function fnUp(){
// this.onmousedown = null;
// this.onmousemove = null;
// }
// 面向过程3
// 在函数内部通过不加var设置全局变量不好,就把全局变量提到最顶端。
// 只是为了定义一些全局变量,目前还没有值,就用null或0初始化值。
// var oBox = null;
// var distX = 0;
// var distY = 0;
// window.onload = function(){
// oBox = document.getElementById('box1');
// oBox.onmousedown = fnDown;
// }
// function fnDown(e){
// var ev = e || window.event;
// ev.stopPropagation();
// distX = ev.clientX-this.offsetLeft;
// distY = ev.clientY-this.offsetTop;
// document.onmousemove = fnMove;
// document.onmouseup = fnUp;
// // console.log(this);
// }
// function fnMove(e){
// var ev = e || window.event;
// ev.stopPropagation();
// var newX = ev.clientX;
// var newY = ev.clientY;
// oBox.style.left = newX-distX+"px";
// oBox.style.top = newY-distY+"px";
// }
// function fnUp(){
// this.onmousedown = null;
// this.onmousemove = null;
// // console.log(this);
// }

// 转化成面向对象
// 1.全局变量转换为Drag的属性,在前面加this,this指向Drag。
// 2.若onmousedown直接=fnDown,fnDown中的this就是指向this.oBox,而非Drag。
// fnDown为Drag的方法,它的this必须指向Drag。把Drag的this赋值给_this,就可
// 在onmousedown后建立匿名函数function(){},调用Drag的fnDown方法,即_this.fnDown()。
// 3.同理通过var _this = this,把Drag的fnMove,fnUp方法的this指向摆正。
// 4.之前fnDown是oBox调用的,里面的this.offsetLeft,指向oBox,现在就要变成this.oBox。
// 之前fnUp是document调用的,里面的this指向document,现this指向是Drag,就要把this变成document。

// 注:实验表明,不以原型的方式定义函数,单用this把各方法与Drag绑到一块不起作用,

function Drag(id){
this.oBox = document.getElementById(id);
this.distX = 0;
this.distY = 0;
var _this = this;
this.oBox.onmousedown = function(){
_this.fnDown();
}
}
Drag.prototype.fnDown = function(e){
var ev = e || window.event;
ev.stopPropagation();
this.distX = ev.clientX-this.oBox.offsetLeft;
this.distY = ev.clientY-this.oBox.offsetTop;
var _this = this;
document.onmousemove = function(){
_this.fnMove();
}
document.onmouseup = function(){
_this.fnUp();
}
}
Drag.prototype.fnMove = function(e){
var ev = e || window.event;
ev.stopPropagation();
var newX = ev.clientX;
var newY = ev.clientY;
this.oBox.style.left = newX-this.distX+"px";
this.oBox.style.top = newY-this.distY+"px";
}
Drag.prototype.fnUp = function(){
document.onmousedown = null;
document.onmousemove = null;
}
window.onload = function(){
var drag1 = new Drag("box1");
}

转载于:https://www.cnblogs.com/forlong/p/8459599.html

JS的面向对象二(通过构造函数的方式)相关推荐

  1. 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)

    单例设计模式(Singleton Pattern) 1. 单例模式解决的问题: 表现形式: Var obj = {xxx; xxx, - } 2. 作用: 把描述同一件事物的属性和特征进行" ...

  2. js自定义类,混合的构造函数/原型方式

    "混合的构造函数/原型方式" 用构造函数来定义非函数属性,用原型方式定义对象的函数属性,结果所有函数都只创建一次,而每个对象都具有自由的对象属性实例.  function ocar ...

  3. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...

  4. 利用jquery的qrcode.js插件生成二维码的两种方式的使用

    2019独角兽企业重金招聘Python工程师标准>>> 利用jquery的qrcode.js插件生成二维码的额两种方式,canvas(即画布)方式和table方式(原文地址http: ...

  5. js笔记(二)数组、对象、this

    大标题 小节 一.数组 1. 数组的创建.赋值.分类: 2. 数组的简单操作(根据索引增.查.改): 3. 声明式和构造函数创建的数组的区别: 4.数组的方法:push().unshift().spl ...

  6. 我来重新学习js的面向对象(part 4)

    我来重新学习js 的面向对象(part 4) 续上一篇,随着业务越来越大,要考虑一些继承的玩意了,大千世界,各种东西我们要认识和甄别是需要靠大智慧去分门别类,生物学中把动植物按界.门.纲.目.科.属. ...

  7. js常见的的6种继承方式

    继承是面向对象的,继承可以帮助我们更好的复用以前的代码,缩短开发周期,提高开发效率:继承也常用在前端工程技术库的底层搭建上,在整个js的学习中尤为重要 常见的继承方式有以下的六种 一.原型链继承 原型 ...

  8. (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】

    JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...

  9. php获取数据3中方式,PHP面向对象之3种数据访问方式详解(代码实例)

    PHP面向对象之3种数据访问方式详解(代码实例) 本文目标 掌握PHP中数据访问的3种方式的定义和作用 1.public 2.protected 3.private (一).数据访问的3种方式 1.P ...

最新文章

  1. MySQL中REGEXP正则查询同一个字段模糊搜索
  2. mysql怎么实现确认收货_Tp结合redis实现订单自动收货
  3. 基于UDP的服务器端和客户端
  4. java2期末考试试题及答案_《JAVA语言程序设计》期末考试试题及答案(2)
  5. 分析递归函数的时间复杂度
  6. 【VBA】查看窗口当前状态
  7. 基础拾遗------泛型详解
  8. 2021 程序媛跳槽记:学习计划篇(已收获字节等offer)
  9. [渝粤教育] 西南科技大学 经济数学1 在线考试复习资料
  10. numpy生成服从特定分布(制定分布)的数据
  11. c语言读取txt第二行数值,c语言读取文件的第二行
  12. java, android的aes等加密库
  13. 说一说我电脑上的那些必备软件
  14. 宽带运营商为什么限制上行带宽
  15. wifi一到晚上服务器无响应,一到晚上九点,网络就开始卡了?主要原因是这三点!...
  16. Scikit-learn学习系列 | 1. sklearn的简要使用介绍与数据集获取
  17. REdis主从复制之repl_backlog
  18. Linux操作系统基础知识命令参数详解
  19. zabbix自定义监控项及触发动作
  20. 《python深度学习》学习笔记与代码实现(第六章,6.3 循环神经网络的高级用法)

热门文章

  1. 对参考文献格式的一些举例
  2. 英勇地死去 VS 卑贱地活着
  3. 社保查询或者转移的一些事
  4. jsp开源网址导航-IT库网址导航源码下载-仿2345部分导航
  5. 使用Advanced Installer为LabVIEW应用(exe)制作升级更新程序(updater)
  6. 使用 HeadSpin BYOD 进行现场测试
  7. Arduino连接pH计
  8. 【OpenCV入门指南】第十篇 彩色直方图均衡化
  9. python中 pip不慎卸载了,重新安装方法
  10. 机器学习-朴素贝叶斯。