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 相关文章推荐
ie8模式下click无反应点击option无反应的解决方法
Oct 11 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
分享我对JS插件开发的一些感想和心得
Feb 04 Javascript
jQuery EasyUI Tab 选项卡问题小结
Aug 16 Javascript
JS只能输入正整数的简单实例
Oct 07 Javascript
JS焦点图,JS 多个页面放多个焦点图的实例
Dec 08 Javascript
基于JavaScript实现全选、不选和反选效果
Feb 15 Javascript
React Native 环境搭建的教程
Aug 19 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 Javascript
javascript实现文本框标签验证的实例代码
Oct 14 Javascript
微信小程序实现炫酷的弹出式菜单特效
Jan 28 Javascript
Javascript三种字符串连接方式及性能比较
May 28 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
mac下安装nginx和php
2013/11/04 PHP
php中字符串和正则表达式详解
2014/10/23 PHP
PHP中的命名空间详细介绍
2015/07/02 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
《JavaScript高级程序设计》阅读笔记(一) ECMAScript基础
2012/02/27 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
弹出最简单的模式化遮罩层的js代码
2013/12/04 Javascript
jQuery中attr()和prop()在修改checked属性时的区别
2014/07/18 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
node操作mysql数据库实例详解
2017/03/17 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
vue2.0 自定义日期时间过滤器
2017/06/07 Javascript
详解基于vue的移动web app页面缓存解决方案
2017/08/03 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
Vue.js用法详解
2017/11/13 Javascript
Python中的类学习笔记
2014/09/23 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
python3中set(集合)的语法总结分享
2017/03/24 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
python之pandas用法大全
2018/03/13 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
2014年五四青年节活动策划书
2014/04/22 职场文书
专科生就业求职信
2014/06/22 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
杭州西湖英语导游词
2015/02/03 职场文书
大学生实习推荐信
2015/03/27 职场文书
复兴之路展览观后感
2015/06/02 职场文书