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 相关文章推荐
5个JavaScript经典面试题
Oct 13 Javascript
javascript中使用正则表达式清理table样式的代码
Apr 01 Javascript
AngularJS 实现弹性盒子布局的方法
Aug 30 Javascript
jQuery+json实现动态创建复杂表格table的方法
Oct 25 Javascript
vue脚手架vue-cli的学习使用教程
Jun 06 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
jquery 键盘事件 keypress() keydown() keyup()用法总结
Oct 23 jQuery
vue中利用iscroll.js解决pc端滚动问题
Feb 15 Javascript
原生javascript运动函数的封装示例【匀速、抛物线、多属性的运动等】
Feb 23 Javascript
Vue computed 计算属性代码实例
Apr 22 Javascript
Vue循环遍历选项赋值到对应控件的实现方法
Jun 22 Javascript
如何利用javascript接收json信息并进行处理
Aug 06 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
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP-MySQL教程归纳总结
2008/06/07 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
PHP数组实例详解
2016/06/26 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
javascript 单选框,多选框美化代码
2008/08/01 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
AngularJs实现ng1.3+表单验证
2015/12/10 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
js禁止浏览器页面后退功能的实例(推荐)
2017/09/01 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
2018/11/14 jQuery
vue-cli3全面配置详解
2018/11/14 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
详解Python进程间通信之命名管道
2017/08/28 Python
python实现图片筛选程序
2018/10/24 Python
python分别打包出32位和64位应用程序
2020/02/18 Python
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
后进生转化工作制度
2014/01/17 职场文书
北体毕业生求职信
2014/02/28 职场文书
党性教育心得体会
2014/09/03 职场文书
常务副县长“四风”个人对照检查材料思想汇报
2014/10/02 职场文书
党的群众路线教育实践活动查摆问题及整改措施
2014/10/10 职场文书
2014年外联部工作总结
2014/11/17 职场文书
导游词300字
2015/02/13 职场文书
后勤工作个人总结
2015/02/28 职场文书
2015年检察院个人工作总结
2015/05/20 职场文书
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python