Saya pikir Tim mengatakannya dengan cukup baik , tapi mari kita mundur:
Elemen DOM adalah objek, benda di memori. Seperti kebanyakan objek di OOP, ia memiliki properti . Ini juga, secara terpisah, memiliki peta atribut yang ditentukan pada elemen (biasanya berasal dari markup yang dibaca browser untuk membuat elemen). Beberapa properti elemen mendapatkan nilai awal mereka dari atribut dengan nama yang sama atau mirip ( valuemendapatkan nilai awal dari atribut "nilai"; hrefmendapatkan nilai awal dari atribut "href", tetapi itu bukan nilai yang sama persis; classNamedari atribut "class"). Properti lain mendapatkan nilai awalnya dengan cara lain: Misalnya, parentNodeproperti mendapatkan nilainya berdasarkan elemen induknya;style properti, apakah itu memiliki atribut "style" atau tidak.
Mari kita pertimbangkan jangkar ini di halaman di http://example.com/testing.html:
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
Beberapa seni ASCII gratis (dan meninggalkan banyak hal):
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| HTMLAnchorElement |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
| href: "http://example.com/foo.html" |
| nama: "fooAnchor" |
| id: "fooAnchor" |
| className: "test one" |
| atribut: |
| href: "foo.html" |
| nama: "fooAnchor" |
| id: "fooAnchor" |
| class: "test one" |
+ −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− +
Perhatikan bahwa sifat dan atributnya berbeda.
Sekarang, meskipun mereka berbeda, karena semua ini berkembang alih-alih dirancang dari bawah ke atas, sejumlah properti menulis kembali ke atribut yang mereka berasal dari jika Anda mengaturnya. Tetapi tidak semua melakukannya, dan seperti yang Anda lihat dari hrefatas, pemetaan tidak selalu berupa "meneruskan nilai", terkadang ada interpretasi yang terlibat.
Ketika saya berbicara tentang properti yang merupakan properti dari suatu objek, saya tidak berbicara secara abstrak. Ini beberapa kode non-jQuery:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(Nilai-nilai itu sesuai dengan kebanyakan browser; ada beberapa variasi.)
The linkobjek adalah hal yang nyata, dan Anda dapat melihat ada perbedaan nyata antara mengakses properti di atasnya, dan mengakses sebuah atribut .
Seperti yang dikatakan Tim, sebagian besar waktu, kami ingin bekerja dengan properti. Sebagian karena nilai-nilai mereka (bahkan nama mereka) cenderung lebih konsisten di seluruh browser. Kami sebagian besar hanya ingin bekerja dengan atribut ketika tidak ada properti yang terkait dengannya (atribut khusus), atau ketika kami tahu bahwa untuk atribut tertentu, atribut dan properti bukan 1: 1 (seperti dengan hrefdan "href" di atas) .
Properti standar disajikan dalam berbagai spesifikasi DOM:
Spesifikasi ini memiliki indeks yang sangat baik dan saya sarankan menyimpan tautan ke dalamnya; Saya menggunakannya sepanjang waktu.
Atribut khusus akan mencakup, misalnya, data-xyzatribut apa pun yang mungkin Anda masukkan ke elemen untuk memberikan meta-data ke kode Anda (sekarang itu berlaku pada HTML5, selama Anda tetap menggunakan data-awalan). (Versi terbaru jQuery memberi Anda akses ke data-xyzelemen melalui datafungsi, tetapi fungsi itu bukan hanya pengakses untuk data-xyzatribut [ia melakukan keduanya lebih banyak dan lebih sedikit dari itu]; kecuali jika Anda benar-benar membutuhkan fitur-fiturnya, saya akan menggunakan attrfungsi untuk berinteraksi dengan data-xyzatribut.)
The attrfungsi yang digunakan untuk memiliki beberapa berbelit-belit logika sekitar mendapatkan apa yang mereka pikir Anda inginkan, bukan secara harfiah mendapatkan atribut. Itu menyatukan konsep. Pindah ke propdan attrdimaksudkan untuk menghapus konfigurasi mereka. Sebentar di v1.6.0 jQuery pergi terlalu jauh dalam hal itu, tapi fungsi dengan cepat ditambahkan kembali ke attruntuk menangani situasi umum di mana orang menggunakan attrketika teknis mereka harus menggunakan prop.