JavaScript中prototype为对象添加属性的误区介绍


Posted in Javascript onOctober 15, 2013

先上需要用到的全部代码片段(截取)

MenuControl.prototype.boxDisplay = false;//是否显示图层选择菜单 
MenuControl.prototype.controlUI; 
MenuControl.prototype.show = function(){ 
if(pointControl.boxDisplay){ 
pointControl.hide(); 
} 
menuBoxDiv.style.display = ""; 
this.boxDisplay = true; 
this.controlUI.style.backgroundColor = '#DDDDDD'; 
}; 
MenuControl.prototype.hide = function(){ 
menuBoxDiv.style.display = "none"; 
this.boxDisplay = false; 
this.controlUI.style.backgroundColor = 'white'; 
}; 
//图层选择开关 
function MenuControl(controlDiv, map) { 
controlDiv.style.padding = '5px'; 
var controlUI = document.createElement('div'); 
this.controlUI = controlUI; 
controlUI.style.backgroundColor = 'white'; 
controlUI.style.height = '18px'; 
controlUI.style.borderStyle = 'solid'; 
controlUI.style.borderWidth = '1px'; 
controlUI.style.cursor = 'pointer'; 
controlUI.style.textAlign = 'center'; 
controlUI.title = '点击启用菜单'; 
controlDiv.appendChild(controlUI); 
var controlText = document.createElement('div'); 
controlText.style.fontFamily = 'Arial,sans-serif'; 
controlText.style.fontSize = '12px'; 
controlText.style.paddingLeft = '4px'; 
controlText.style.paddingRight = '4px'; 
controlText.innerHTML = '<strong>图层选择</strong>'; 
controlUI.appendChild(controlText); 

google.maps.event.addDomListener(controlUI, 'click', function() { 
if(menuControl.boxDisplay){ 
menuControl.hide(); 
}else{ 
menuControl.show(); 
} 
}); 
} 
//点开关框体 
PointControl.prototype.boxDisplay = false;//是否显示图层选择菜单 
PointControl.prototype.controlUI; 
PointControl.prototype.show = function(){ 
if(menuControl.boxDisplay){ 
menuControl.hide(); 
} 
pointBoxDiv.style.display = ""; 
this.boxDisplay = true; 
this.controlUI.style.backgroundColor = '#DDDDDD'; 
}; 
PointControl.prototype.hide = function(){ 
pointBoxDiv.style.display = "none"; 
this.boxDisplay = false; 
this.controlUI.style.backgroundColor = 'white'; 
}; 
function PointControl(controlDiv, map) { 
controlDiv.style.padding = '5px'; 

var controlUI = document.createElement('div'); 
this.controlUI = controlUI; 
controlUI.style.backgroundColor = 'white'; 
controlUI.style.height = '18px'; 
controlUI.style.borderStyle = 'solid'; 
controlUI.style.borderWidth = '1px'; 
controlUI.style.cursor = 'pointer'; 
controlUI.style.textAlign = 'center'; 
controlUI.title = '点击操控点菜单'; 
controlDiv.appendChild(controlUI); 

var controlText = document.createElement('div'); 
controlText.style.fontFamily = 'Arial,sans-serif'; 
controlText.style.fontSize = '12px'; 
controlText.style.paddingLeft = '4px'; 
controlText.style.paddingRight = '4px'; 
controlText.innerHTML = '<strong>点</strong>'; 
controlUI.appendChild(controlText); 

google.maps.event.addDomListener(controlUI, 'click', function() { 
if(pointControl.boxDisplay){ 
pointControl.hide(); 
}else{ 
pointControl.show(); 
} 
}); 
}

做的是谷歌的地图应用,其中有右方有两个div按钮,通过点击打开左方的div子菜单
JavaScript中prototype为对象添加属性的误区介绍 
要求是
JavaScript中prototype为对象添加属性的误区介绍 
打开前判断该子菜单是否已经为打开状态,如是,则先关闭,后打开

在开关子菜单时,按钮会据相应行为变色

这里就要求在各个按钮的show()方法下操作另一按钮的属性和方法来达到开关的效果

开始时写成这样

MenuControl.prototype.controlUI; 
MenuControl.prototype.show = function(){ 
controlUI.style.backgroundColor = '#DDDDDD';//直接调用属性 
}; 
function MenuControl(controlDiv, map) { 
controlUI = document.createElement('div'); 
controlUI.style.backgroundColor = 'white'; 
}

结果无论开关哪一个菜单,都只有“点”按钮变色

原因大概是controlUI莫名定义为全局变量了

后来我试图这样

MenuControl.prototype.controlUI; 
MenuControl.prototype.show = function(){ 
this.controlUI.style.backgroundColor = '#DDDDDD';//添加this关键字 
}; 
function MenuControl(controlDiv, map) { 
controlUI = document.createElement('div'); 
controlUI.style.backgroundColor = 'white'; 
}

结果还是失败

后来我想通了,大概这样就可以了

MenuControl.prototype.controlUI.style.backgroundColor = "white";//一上来就给你赋值,看你往哪儿跑 
MenuControl.prototype.show = function(){ 
this.controlUI.style.backgroundColor = '#DDDDDD'; 
}; 
function MenuControl(controlDiv, map) { 
controlUI = document.createElement('div'); 
this.controlUI.style.backgroundColor = 'white'; 
}

这样至少有错误信息了,不能给undefined添加style属性什么的

于是我绝望了,准备给所有属性也添加上全局变量,这样调用就方便许多

没成想,被自己启发了

于是就有了最开始那段代码

MenuControl.prototype.controlUI;//先建立此属性,挖一个坑 
MenuControl.prototype.show = function(){ 
this.controlUI.style.backgroundColor = '#DDDDDD';//使用this关键字调用,实际调用的是this.controlUI对象 
}; 
function MenuControl(controlDiv, map) { 
var controlUI = document.createElement('div');//建立局部变量,并正常赋值 
this.controlUI = controlUI;//将此局部变量反赋给this对象的属性,达到关联引用 
controlUI.style.backgroundColor = 'white';//正常调用引用对象进行操控 
}

这样就将prototype添加的属性和自身创建的局部变量关联起来,使其可被外部其它对象所调用获取

达到成功将同名属性通过类对象进行区分并全局调用

Javascript 相关文章推荐
JS的事件绑定深入认识
Jun 26 Javascript
javascript求日期差的方法
Mar 02 Javascript
Bootstrap按钮组件详解
Apr 26 Javascript
基于jQuery实现动态搜索显示功能
May 05 Javascript
微信公众号 摇一摇周边功能开发
Dec 08 Javascript
js a标签点击事件
Mar 30 Javascript
微信小程序 支付功能实现PHP实例详解
May 12 Javascript
bootstrapvalidator之API学习教程
Jun 29 Javascript
js JSON.stringify()基础详解
Jun 19 Javascript
使用vue中的混入mixin优化表单验证插件问题
Jul 02 Javascript
vue 解决form表单提交但不跳转页面的问题
Oct 30 Javascript
vuex刷新后数据丢失的解决方法
Oct 18 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 #Javascript
js计算字符串长度包含的中文是utf8格式
Oct 15 #Javascript
Javascript中查找不以XX字符结尾的单词示例代码
Oct 15 #Javascript
通过js获取div的background-image属性
Oct 15 #Javascript
js日期相关函数总结分享
Oct 15 #Javascript
JavaScript的继承的封装介绍
Oct 15 #Javascript
jquery实现兼容浏览器的图片上传本地预览功能
Oct 14 #Javascript
You might like
咖啡的传说和历史
2021/03/03 新手入门
str_replace只替换一次字符串的方法
2013/04/09 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
yii2安装详细流程
2018/05/23 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
js获取某元素的class里面的css属性值代码
2014/01/16 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
微信小程序  modal详解及实例代码
2016/11/09 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
JavaScript学习笔记之惰性函数示例详解
2017/08/27 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
详解在Node.js中发起HTTP请求的5种方法
2019/01/10 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
vue实现学生信息管理系统
2020/05/30 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
体育教育个人自荐信范文
2013/12/01 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
秋季运动会稿件
2014/01/30 职场文书
寒假家长评语大全
2014/04/16 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
推荐信范文大全
2015/03/27 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript
对讲机知识
2022/04/07 无线电