Apa perbedaan antara sintaksis berbasis konstruktor ini untuk membuat objek:
person = new Object()
... dan sintaks literal ini:
person = {
property1 : "Hello"
};
Tampaknya keduanya melakukan hal yang sama, meskipun JSLint lebih suka Anda menggunakan notasi objek literal.
Mana yang lebih baik dan mengapa?
javascript
object
jslint
ectype
sumber
sumber
a = new Object
,a = new Object()
,a = {}
, literal jauh lebih sederhana dan beberapa tes aku berlari sambil lalu mengatakan itu adalah lebih cepat, kompiler yang lebih baru mungkin telah menyebabkan pernyataan saya palsu. Hal yang sama berlaku untuk array literalvar
kata kunci dalam kode aplikasi Anda untuk menghindari mencemari namespace global dan menciptakan kebutuhan untuk melihat melampaui catatan saat ini dalam tumpukan untuk variabel Anda.new
adalah sebuah konvensi yang melampaui nitpicking sia-sia dari bahasa yang biasa-biasa saja. Gunakannew
karena maknanya jelas. Dalam 99,9% kasus, keuntungan kinerja tidak relevan.Jawaban:
Mereka berdua melakukan hal yang sama (kecuali seseorang melakukan sesuatu yang tidak biasa), selain itu orang kedua Anda membuat objek dan menambahkan properti ke sana. Tetapi notasi literal membutuhkan lebih sedikit ruang dalam kode sumber. Ini jelas dikenali apa yang terjadi, jadi menggunakan
new Object()
, Anda benar-benar hanya mengetik lebih banyak dan (secara teori, jika tidak dioptimalkan oleh mesin JavaScript) melakukan pemanggilan fungsi yang tidak perlu.Ini
secara teknis tidak melakukan hal yang sama. Yang pertama hanya menciptakan objek. Yang kedua menciptakan dan menetapkan properti. Agar yang pertama sama, Anda perlu langkah kedua untuk membuat dan menetapkan properti.
"Sesuatu yang tidak biasa" yang bisa dilakukan seseorang adalah membayangi atau menetapkan ke
Object
global default :Dalam kasus yang sangat tidak biasa itu,
new Object
akan gagal tetapi{}
akan berhasil.Dalam praktiknya, tidak pernah ada alasan untuk menggunakan
new Object
daripada{}
(kecuali Anda telah melakukan hal yang sangat tidak biasa).sumber
()
new Object()
tidak diperlukan. (berbicara tentang tidak diperlukan thingy)Tidak ada perbedaan untuk objek sederhana tanpa metode seperti pada contoh Anda. Namun, ada perbedaan besar ketika Anda mulai menambahkan metode ke objek Anda.
Cara literal:
Cara prototipe:
Kedua cara memungkinkan pembuatan instance
Obj
seperti ini:Namun, dengan cara literal, Anda membawa salinan
sayHello
metode dalam setiap instance objek Anda. Sedangkan, dengan cara prototipe, metode didefinisikan dalam prototipe objek dan dibagi di antara semua instance objek. Jika Anda memiliki banyak objek atau banyak metode, cara literalnya dapat menyebabkan pemborosan memori yang cukup besar.sumber
new Object()
vs{}
untuk membuat objek kosong.Dalam JavaScript, kami dapat mendeklarasikan objek kosong baru dengan dua cara:
Saya tidak menemukan apa pun yang menunjukkan bahwa ada perbedaan yang signifikan antara keduanya sehubungan dengan bagaimana mereka beroperasi di belakang layar (tolong perbaiki saya jika saya salah - saya ingin tahu). Namun, metode kedua (menggunakan notasi objek literal) menawarkan beberapa keuntungan.
Pertimbangkan objek baru yang berisi Nama anggota dan TelNo. Menggunakan konvensi Object () baru, kita dapat membuatnya seperti ini:
Fitur Properti Expando dari JavaScript memungkinkan kami membuat anggota baru dengan cepat, dan kami mencapai apa yang ingin dicapai. Namun, cara ini tidak terlalu terstruktur atau dienkapsulasi. Bagaimana jika kita ingin menentukan anggota berdasarkan kreasi, tanpa harus bergantung pada properti expo dan penugasan pasca kreasi?
Di sinilah objek notasi literal dapat membantu:
Di sini kami telah mencapai efek yang sama dalam satu baris kode dan karakter yang jauh lebih sedikit.
Diskusi lebih lanjut metode konstruksi objek di atas dapat ditemukan di: JavaScript dan Pemrograman Berorientasi Objek (OOP).
Dan akhirnya, bagaimana dengan orang idiot yang mengalahkan Object? Apakah Anda pikir itu tidak mungkin? Nah, JSFiddle ini membuktikan sebaliknya. Menggunakan objek notasi literal mencegah kita dari kejatuhan lawak ini.
(Dari http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ )
sumber
new Object()
karena kemungkinan sesuatu menimpa fungsi Objek, Anda juga harus menulis penjaga di semua tempat ketika Anda menggunakan pembantu inginObject.keys
memastikan itu tidak terdefinisi, yang turun menjadi absurd. Saya selalu merekomendasikan orang menggunakan notasi literal, tetapi saya pikir argumen khusus ini berantakan ketika Anda memikirkan konsekuensi dari berpikir seperti itu.Di komputer saya menggunakan Node.js, saya menjalankan yang berikut:
Catatan, ini merupakan perluasan dari apa yang ditemukan di sini: Mengapa arr = [] lebih cepat dari arr = new Array?
output saya adalah sebagai berikut:
jadi jelas {} dan [] lebih cepat daripada menggunakan baru untuk membuat objek / array kosong.
sumber
Semua orang di sini berbicara tentang kesamaan keduanya. Saya akan menunjukkan perbedaannya.
Menggunakan
new Object()
memungkinkan Anda untuk melewati objek lain. Hasil yang jelas adalah bahwa objek yang baru dibuat akan diatur ke referensi yang sama. Berikut ini contoh kode:Penggunaannya tidak terbatas pada objek seperti pada objek OOP. Tipe lain juga bisa diteruskan. Fungsi akan mengatur jenis sesuai. Misalnya jika kita meneruskan bilangan bulat 1 ke sana, objek nomor tipe akan dibuat untuk kita.
Objek yang dibuat menggunakan metode di atas (
new Object(1)
) akan dikonversi ke tipe objek jika properti ditambahkan padanya.Jika objek adalah salinan kelas objek anak, kita bisa menambahkan properti tanpa konversi tipe.
sumber
str
tipestring
sehingga Anda tidak dapat menetapkan properti untuk itu. jsfiddle.net/grq6hdx7/1var obj = new Object("foo"); typeof obj; obj === "foo" // true
Sebenarnya, ada beberapa cara untuk membuat objek dalam JavaScript. Saat Anda hanya ingin membuat objek, tidak ada untungnya membuat objek " berbasis konstruktor " menggunakan operator " baru ". Ini sama dengan membuat objek menggunakan sintaks " objek literal ". Tetapi objek " berbasis konstruktor " yang dibuat dengan operator " baru " mulai digunakan secara luar biasa ketika Anda berpikir tentang " warisan prototypal ". Anda tidak dapat mempertahankan rantai pewarisan dengan objek yang dibuat dengan sintaks literal. Tetapi Anda dapat membuat fungsi konstruktor , melampirkan properti dan metode ke prototipe."Operator, itu akan mengembalikan objek yang akan memiliki akses ke semua metode dan properti yang dilampirkan dengan prototipe fungsi konstruktor itu.
Berikut adalah contoh membuat objek menggunakan fungsi konstruktor (lihat penjelasan kode di bagian bawah):
Sekarang, Anda dapat membuat objek sebanyak yang Anda inginkan dengan membuat fungsi konstruksi Person dan semuanya akan mewarisi nama lengkap () darinya.
Catatan: kata kunci " ini " akan merujuk ke objek kosong dalam fungsi konstruktor dan setiap kali Anda membuat objek baru dari Orang yang menggunakan operator " baru ", kata kunci ini akan secara otomatis mengembalikan objek yang berisi semua properti dan metode yang dilampirkan dengan kata kunci " ini " . Dan objek ini pasti akan mewarisi metode dan properti yang dilampirkan dengan prototipe fungsi konstruktor Person (yang merupakan keuntungan utama dari pendekatan ini).
Omong-omong, jika Anda ingin mendapatkan fungsionalitas yang sama dengan sintaks " objek literal ", Anda harus membuat nama lengkap () pada semua objek seperti di bawah ini:
Akhirnya, jika Anda sekarang bertanya mengapa saya harus menggunakan pendekatan fungsi konstruktor alih-alih pendekatan objek literal :
*** Warisan prototipe memungkinkan rantai pewarisan sederhana yang bisa sangat berguna dan kuat.
*** Ini menghemat memori dengan mewarisi metode umum dan properti yang didefinisikan dalam prototipe fungsi konstruktor. Jika tidak, Anda harus menyalinnya berulang-ulang di semua objek.
Saya harap ini masuk akal.
sumber
Object.create(<object defined using literal notation>)
ataunew Object(<object defined using literal notation>)
dan membuat rantai warisan sesuai kebutuhan.function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
Juga, menurut beberapa buku javascript O'Really .... (dikutip)
Alasan lain untuk menggunakan literal yang bertentangan dengan konstruktor Obyek adalah bahwa tidak ada resolusi ruang lingkup. Karena mungkin Anda telah membuat konstruktor lokal dengan nama yang sama, penafsir perlu mencari rantai lingkup dari tempat Anda memanggil Object () sepanjang jalan sampai menemukan global Object constructor.
sumber
Saya telah menemukan satu perbedaan, untuk ES6 / ES2015. Anda tidak dapat mengembalikan objek menggunakan sintaks fungsi panah steno, kecuali jika Anda mengelilingi objek tersebut
new Object()
.Hal ini karena compiler bingung oleh
{}
kurung dan berpikirn: i
adalah label: pernyataan konstruksi; titik koma adalah opsional sehingga tidak mengeluh tentang hal itu.Jika Anda menambahkan properti lain ke objek itu akhirnya akan menimbulkan kesalahan.
sumber
[1, 2, 3].map(v => { return {n: v}; });
akan memberikan Anda hal yang sama ...param => return_value
, dan perbedaan antara menggunakan{}
dannew Object()
dalam hal ini.[1, 2, 3].map(v => ({n: v}));
Pembaruan 2019
Saya menjalankan kode yang sama dengan @rjloura pada simpul OSX High Sierra 10.13.6 saya versi 10.13.0 dan ini adalah hasilnya
sumber
Penggunaan memori berbeda jika Anda membuat 10 ribu instance.
new Object()
hanya akan menyimpan satu salinan saja sementara{}
akan menyimpan 10 ribu salinan.sumber
new
menciptakan objek baru. Mereka berdua mengambil jumlah memori yang sama.