JavaScript中的property和attribute介紹

來源:互聯網
上載者:User

首先看看這兩個單詞的英文釋義(來自有道詞典)。先是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方法來擷取。

property and attribute

照圖似乎更易理解,getAttribute無法擷取到不屬於attribute的property也是理所應當。但是這時候你會發現另外一個問題,通過setAttribute設定的屬性,同樣也應該屬於property,那麼為何無法通過點號擷取?

我們換種理解,只有標準屬性才可同時使用標準方法和點號方法,而對於自訂屬性,標準方法和點號方法互不干擾。

自訂屬性互不干擾

那麼,在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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.