JavaScript中的property和attribute介绍


Posted in Javascript onDecember 26, 2011

首先看看这两个单词的英文释义(来自有道词典)。先是property:

property ['prɔpəti] n. 性质,性能;财产;所有权 
英英释义: 
any area set aside for a particular purpose “the president was concerned about the property across from the White House” 
同义词:place 
something owned; any tangible or intangible possession that is owned by someone “that hat is my property”; ” he is a man of property” 
同义词:belongings | holding | material possession 
a basic or essential attribute shared by all members of a class 
a construct whereby objects or individuals can be distinguished “self-confidence is not an endearing property” 
同义词:attribute | dimension 
any movable articles or objects used on the set of a play or movie 
同义词:prop

重点看2、3、4条。
再看attribute:
attribute [ə'tribju:t, 'ætribju:t] 
n. 属性;特质 
vt. 归属;把…归于 
英英释义: 
n. 
a construct whereby objects or individuals can be distinguished 
同义词:property | dimension 
an abstraction belonging to or characteristic of an entity 
v. 
attribute or credit to ”We attributed this quotation to Shakespeare” 
同义词:impute | ascribe | assign 
decide as to where something belongs in a scheme 
同义词:assign

property,attribute都作“属性”解,但是attribute更强调区别于其他事物的特质/特性,而在这篇文章中也提交到attribute是property的子集。
而在JavaScript中,property和attribute更是有明显的区别。众所周知,setAttribute是为DOM节点设置/添加属性的标准方法:
var ele = document.getElementById("my_ele"); ele.setAttribute("title","it's my element");但很多时候我们也这样写:
ele.title = "it's my element";如果不出什么意外,他们都运行的很好,它们似乎毫无区别?而且通常情况下我们还想获取到我们设置的“属性”,我们也很爱这样写:
alert(ele.title);这时候,你便会遇到问题,如果你所设置的属性属于DOM元素本身所具有的标准属性,不管是通过ele.setAttribute还是ele.title的方式设置,都能正常获取。但是如果设置的属性不是标准属性,而是自定义属性呢?
ele.setAttribute('mytitle','test my title'); alert(ele.mytitle); //undefined alert(ele.getAttribute('mytitle')); //'test my title' ele.yourtitle = 'your test title'; alert(ele.getAttribute('yourtitle')); //null alert(ele.yourtitle); //'your test title'通过setAttribute设置的自定义属性,只能通过标准的getAttribute方法来获取;同样通过点号方式设置的自定义属性也无法通过 标准方法getAttribute来获取。在对自定义属性的处理方式上,DOM属性的标准方法和点号方法不再具有任何关联性(上诉代码在IE6-有兼容性 问题,后面会继续介绍)。
这种设置、获取“属性”的差异性,究其根源,其实也是property与attribute的差异性所致。
通过点号设置的“属性”其实是设置的property,如上所说attribute是property的子集,那么点号设置的property自然无法通过只能获取attribute的getAttribute方法来获取。
JavaScript中的property和attribute介绍

property and attribute

照图似乎更易理解,getAttribute无法获取到不属于attribute的property也是理所应当。但是这时候你会发现另外一个问题,通过setAttribute设置的属性,同样也应该属于property,那么为何无法通过点号获取?

我们换种理解,只有标准属性才可同时使用标准方法和点号方法,而对于自定义属性,标准方法和点号方法互不干扰。

JavaScript中的property和attribute介绍

自定义属性互不干扰

那么,在JavaScript中attribute并不是property的子集,property与attribute仅存在交集,即标准属性,这样疑问都可得到合理的解释。

但在IE9-中,上诉结论并不成立。IE9-浏览器中,除了标准属性,自定义属性也是共享的,即标准方法和点号皆可读写。

成功设置的attribute都会体现在HTML上,通过outerHTML可以看到attribute都被添加到了相应的tag上,所以如果 attribute不是字符串类型数据都会调用toString()方法进行转换。但是由于IE9-中,标准属性与自定义属性不做区 分,attribute依然可以是任意类型数据,并不会调用toString()转换,非字符串attribute不会体现在HTML上,但更为严重的问 题是,这样很容易就会导致内存泄漏。所以如果不是字符串类型的自定义属性,建议使用成熟框架中的相关方法(如jQuery中的data方法)。

getAttribute与点号(.)的差异性
虽然getAttribute和点号方法都能获取标准属性,但是他们对于某些属性,获取到的值存在差异性,比如href,src,value等。

<a href="#" id="link">Test Link</a> <img src="img.png" id="image" /> <input type="text" value="enter text" id="ipt" /> <script> var $ = function(id){return document.getElementById(id);}; alert($('link').getAttribute('href'));//# alert($('link').href);//fullpath/file.html# alert($('image').getAttribute('src'))//img.png alert($('image').src)//fullpath/img.png alert($('ipt').getAttribute('value'))//enter text alert($('ipt').value)//enter text $('ipt').value = 5; alert($('ipt').getAttribute('value'))//enter text alert($('ipt').value)//5 </script>测试可发现getAttribute获取的是元素属性的字面量,而点号获取的是计算值。

更多细节可查看这篇文章:Attributes and custom properties

Javascript 相关文章推荐
JavaScript this 深入理解
Jul 30 Javascript
js substr、substring和slice使用说明小记
Sep 15 Javascript
关于ExtJS4.1:快捷键支持的问题
Apr 24 Javascript
js中方法重载如何实现?以及函数的参数问题
Aug 01 Javascript
js判断字符是否是汉字的两种方法小结
Jan 03 Javascript
javascript 中__proto__和prototype详解
Nov 25 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 Javascript
Bootstrap中CSS的使用方法
Feb 17 Javascript
Vue.js基础知识汇总
Apr 27 Javascript
JQuery的attr 与 val区别
Jun 12 Javascript
vue.js选中动态绑定的radio的指定项
Jun 02 Javascript
使用uni-app开发微信小程序的实现
Dec 13 Javascript
JavaScript打字小游戏代码
Dec 26 #Javascript
js bind 函数 使用闭包保存执行上下文
Dec 26 #Javascript
js 函数调用模式小结
Dec 26 #Javascript
JavaScript 原型继承
Dec 26 #Javascript
jquery事件机制扩展插件 jquery鼠标右键事件。
Dec 26 #Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 #Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
Dec 26 #Javascript
You might like
牡丹941资料
2021/03/01 无线电
PHP中去掉字符串首尾空格的方法
2012/05/19 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
2013/11/12 PHP
jQuery学习笔记之jQuery的动画
2010/12/22 Javascript
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
JavaScript获取图片真实大小代码实例
2014/09/24 Javascript
如何通过js实现图片预览功能【附实例代码】
2016/03/30 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
2016/04/14 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
jQuery事件与动画基础详解
2017/02/23 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
微信小程序实现分享商品海报功能
2019/09/30 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
[05:59]2018DOTA2国际邀请赛寻真——只为胜利的Secret
2018/08/13 DOTA
Python中的异常处理学习笔记
2015/01/28 Python
Python中eval带来的潜在风险代码分析
2017/12/11 Python
python动态文本进度条的实例代码
2020/01/22 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
2020/02/28 Python
彪马法国官网:PUMA法国
2019/12/15 全球购物
自我评价个人范文
2013/12/16 职场文书
服务员岗位职责
2014/01/29 职场文书
市场营销求职信范文
2014/02/21 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
建筑工地标语
2014/06/18 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
升学宴祝酒词
2015/08/11 职场文书
小学体育队列队形教学反思
2016/02/16 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
Vue+Element UI实现概要小弹窗的全过程
2021/05/30 Vue.js
python疲劳驾驶困倦低头检测功能的实现
2022/04/04 Python