JS的面向对象二(通过构造函数的方式)
通过按住鼠标拖动的例子来演示面向对象的过程
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的面向对象二(通过构造函数的方式)相关推荐
- 夯实基础,彻底掌握js的核心技术(二):面向对象编程(Object Oriented Programming)
单例设计模式(Singleton Pattern) 1. 单例模式解决的问题: 表现形式: Var obj = {xxx; xxx, - } 2. 作用: 把描述同一件事物的属性和特征进行" ...
- js自定义类,混合的构造函数/原型方式
"混合的构造函数/原型方式" 用构造函数来定义非函数属性,用原型方式定义对象的函数属性,结果所有函数都只创建一次,而每个对象都具有自由的对象属性实例. function ocar ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承&q ...
- 利用jquery的qrcode.js插件生成二维码的两种方式的使用
2019独角兽企业重金招聘Python工程师标准>>> 利用jquery的qrcode.js插件生成二维码的额两种方式,canvas(即画布)方式和table方式(原文地址http: ...
- js笔记(二)数组、对象、this
大标题 小节 一.数组 1. 数组的创建.赋值.分类: 2. 数组的简单操作(根据索引增.查.改): 3. 声明式和构造函数创建的数组的区别: 4.数组的方法:push().unshift().spl ...
- 我来重新学习js的面向对象(part 4)
我来重新学习js 的面向对象(part 4) 续上一篇,随着业务越来越大,要考虑一些继承的玩意了,大千世界,各种东西我们要认识和甄别是需要靠大智慧去分门别类,生物学中把动植物按界.门.纲.目.科.属. ...
- js常见的的6种继承方式
继承是面向对象的,继承可以帮助我们更好的复用以前的代码,缩短开发周期,提高开发效率:继承也常用在前端工程技术库的底层搭建上,在整个js的学习中尤为重要 常见的继承方式有以下的六种 一.原型链继承 原型 ...
- (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】
JS基础知识二(原型和原型链) 提问 class 继承 类型判断(instanceof) 原型 原型关系 基于原型的执行规则 原型链 说明 提问 如何准确判断一个变量是不是数组 class的原型本质 ...
- php获取数据3中方式,PHP面向对象之3种数据访问方式详解(代码实例)
PHP面向对象之3种数据访问方式详解(代码实例) 本文目标 掌握PHP中数据访问的3种方式的定义和作用 1.public 2.protected 3.private (一).数据访问的3种方式 1.P ...
最新文章
- MySQL中REGEXP正则查询同一个字段模糊搜索
- mysql怎么实现确认收货_Tp结合redis实现订单自动收货
- 基于UDP的服务器端和客户端
- java2期末考试试题及答案_《JAVA语言程序设计》期末考试试题及答案(2)
- 分析递归函数的时间复杂度
- 【VBA】查看窗口当前状态
- 基础拾遗------泛型详解
- 2021 程序媛跳槽记:学习计划篇(已收获字节等offer)
- [渝粤教育] 西南科技大学 经济数学1 在线考试复习资料
- numpy生成服从特定分布(制定分布)的数据
- c语言读取txt第二行数值,c语言读取文件的第二行
- java, android的aes等加密库
- 说一说我电脑上的那些必备软件
- 宽带运营商为什么限制上行带宽
- wifi一到晚上服务器无响应,一到晚上九点,网络就开始卡了?主要原因是这三点!...
- Scikit-learn学习系列 | 1. sklearn的简要使用介绍与数据集获取
- REdis主从复制之repl_backlog
- Linux操作系统基础知识命令参数详解
- zabbix自定义监控项及触发动作
- 《python深度学习》学习笔记与代码实现(第六章,6.3 循环神经网络的高级用法)