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 相关文章推荐
键盘 keycode的值 javascript时触发事件时很有用的要素
Nov 02 Javascript
Extjs入门之动态加载树代码
Apr 09 Javascript
jquery实现的简单二级菜单效果代码
Sep 22 Javascript
form表单转Json提交的方法(推荐)
Sep 23 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
May 02 Javascript
详解Node.js利用node-git-server快速搭建git服务器
Sep 27 Javascript
JavaScript代码执行的先后顺序问题
Oct 29 Javascript
如何从零开始利用js手写一个Promise库详解
Apr 19 Javascript
从零开始搭建vue移动端项目到上线的步骤
Oct 15 Javascript
微信小程序 scroll-view的使用案例代码详解
Jun 11 Javascript
vue3.0 数字翻牌组件的使用方法详解
Apr 20 Vue.js
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
PHP 读取和修改大文件的某行内容的代码
2009/10/30 PHP
8个出色的WordPress SEO插件收集
2011/02/26 PHP
浅谈PHP正则表达式中修饰符/i, /is, /s, /isU
2014/10/21 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
js实现获取焦点后光标在字符串后
2014/09/17 Javascript
JavaScript模拟重力状态下抛物运动的方法
2015/03/03 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
jstl中判断list中是否包含某个值的简单方法
2016/10/14 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
自制简易打赏功能的实例
2017/09/02 Javascript
vue 的keep-alive缓存功能的实现
2018/03/22 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
react+ant design实现Table的增、删、改的示例代码
2018/12/27 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
Webpack中SplitChunksPlugin 配置参数详解
2020/03/24 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
[02:53]DOTA2英雄昆卡基础教程
2013/11/25 DOTA
Python实现简单的可逆加密程序实例
2015/03/05 Python
python如何查看系统网络流量的信息
2016/09/12 Python
Python中字符串的处理技巧分享
2016/09/17 Python
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
django ajax json的实例代码
2018/05/29 Python
WxPython建立批量录入框窗口
2019/02/27 Python
python turtle工具绘制四叶草的实例分享
2020/02/14 Python
Bloomingdale’s阿联酋:选购奢华时尚、美容及更多
2020/09/22 全球购物
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
楼面部长岗位职责范本
2014/02/14 职场文书
党员干部一句话承诺
2014/05/30 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL
python opencv检测直线 cv2.HoughLinesP的实现
2021/06/18 Python