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 相关文章推荐
浅析javascript闭包 实例分析
Dec 25 Javascript
深入分析js中的constructor和prototype
Apr 07 Javascript
JavaScript获取FCK编辑器信息的具体方法
Jul 12 Javascript
jquery弹出关闭遮罩层实例
Aug 06 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
Mar 21 Javascript
javascript实现十秒钟后注册按钮可点击的方法
May 13 Javascript
JS传递对象数组为参数给后端,后端获取的实例代码
Jun 28 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
Oct 15 Javascript
深入理解vue中的$set
Jun 01 Javascript
深入浅出理解JavaScript闭包的功能与用法
Aug 01 Javascript
微信小程序实现评论功能
Nov 28 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
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
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
linux下 C语言对 php 扩展
2008/12/14 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
php获取文件夹路径内的图片以及分页显示示例
2014/03/11 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
javascript json2 使用方法
2010/03/16 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
Javascript函数的参数
2015/07/16 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
Element Breadcrumb 面包屑的使用方法
2020/07/26 Javascript
Python使用py2exe打包程序介绍
2014/11/20 Python
怎样使用Python脚本日志功能
2016/08/14 Python
用python与文件进行交互的方法
2018/03/01 Python
pygame游戏之旅 载入小车图片、更新窗口
2018/11/20 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
python让函数不返回结果的方法
2020/06/22 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
weblogic面试题
2016/03/07 面试题
商务英语本科生的自我评价分享
2013/11/15 职场文书
生态养殖创业计划书
2014/05/06 职场文书
2015年学生会部门工作总结
2015/04/21 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
会计做账心得体会
2016/01/22 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript