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 中document.URL 和 windows.location.href 的区别
Nov 11 Javascript
基于JQuery的一句代码实现表格的简单筛选
Jul 26 Javascript
jquery isType() 类型判断代码
Feb 14 Javascript
jquery自动将form表单封装成json的具体实现
Mar 17 Javascript
php,js,css字符串截取的办法集锦
Sep 26 Javascript
js常用系统函数用法实例分析
Jan 12 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
Dec 14 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
May 20 Javascript
JS制作适用于手机和电脑的通知信息效果
Oct 28 Javascript
js实现文字无缝向上滚动
Feb 16 Javascript
JavaScript中 DOM操作方法小结
Apr 25 Javascript
JS跨浏览器解析XML应用过程详解
Oct 16 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
php单例模式实现方法分析
2015/03/14 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
PHP7实现和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
2019/06/08 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
使用Java实现简单的server/client回显功能的方法介绍
2013/05/03 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
jQuery实现的Div窗口震动效果实例
2015/08/07 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
JS/jQuery实现获取时间的方法及常用类完整示例
2019/03/07 jQuery
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
JS数组reduce()方法原理及使用技巧解析
2020/07/14 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
js实现类选择器和name属性选择器的示例步骤
2021/02/07 Javascript
python文件和目录操作方法大全(含实例)
2014/03/12 Python
遍历python字典几种方法总结(推荐)
2016/09/11 Python
Python tkinter模版代码实例
2020/02/05 Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
2020/05/29 Python
一款纯css3实现的漂亮的404页面的实例教程
2014/11/27 HTML / CSS
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
专注澳大利亚特产和新西兰特产的澳洲中文网:0061澳洲制造
2019/03/24 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
客服部工作职责范本
2014/02/14 职场文书
教导主任竞聘演讲稿
2014/05/16 职场文书
2015年双拥工作总结
2015/04/08 职场文书
2015年物业管理工作总结
2015/04/23 职场文书
2016党员读书思廉心得体会
2016/01/23 职场文书
Python使用MapReduce进行简单的销售统计
2022/04/22 Python