Rekan saya telah menggunakan "fungsi baru ()" dengan huruf kecil "f" untuk mendefinisikan objek baru di JavaScript. Tampaknya berfungsi dengan baik di semua browser utama dan juga tampaknya cukup efektif dalam menyembunyikan variabel pribadi. Berikut contohnya:
var someObj = new function () {
var inner = 'some value';
this.foo = 'blah';
this.get_inner = function () {
return inner;
};
this.set_inner = function (s) {
inner = s;
};
};
Begitu "ini" digunakan, ini menjadi milik umum someObj. Jadi someObj.foo, someObj.get_inner () dan someObj.set_inner () semuanya tersedia untuk umum. Selain itu, set_inner () dan get_inner () adalah metode istimewa, sehingga mereka memiliki akses ke "dalam" melalui penutupan.
Namun, saya belum melihat referensi apa pun untuk teknik ini di mana pun. Bahkan JSLint milik Douglas Crockford mengeluhkannya:
- konstruksi aneh. Hapus 'baru'
Kami menggunakan teknik ini dalam produksi dan tampaknya berhasil dengan baik, tetapi saya agak khawatir karena tidak didokumentasikan di mana pun. Adakah yang tahu jika ini adalah teknik yang valid?
sumber
this
akan merujuk ke elemen yang memicu peristiwa tersebut, bukan objek Anda, tetapi Anda bisa saja melakukannyavar instance = this
.Jawaban:
Saya telah melihat teknik itu sebelumnya, itu valid, Anda menggunakan ekspresi fungsi seolah-olah itu adalah Fungsi Pembuat .
Tetapi IMHO, Anda dapat mencapai hal yang sama dengan ekspresi fungsi pemanggilan otomatis, saya tidak benar-benar melihat gunanya menggunakan
new
operator dengan cara itu:Tujuan dari
new
operator adalah untuk membuat instance objek baru, menyiapkan[[Prototype]]
properti internal, Anda dapat melihat bagaimana ini dibuat oleh[Construct]
properti internal.Kode di atas akan menghasilkan hasil yang setara.
sumber
function foo () {}
mengembalikan hasil dari membuatFunction
objek [mungkin dengan Fungsi baru ()]. Ini gula sintaks.return instance;
pada akhirnya. Jika tidak,someObj
hanya akanundefined
. :-)=
Kode Anda sama dengan konstruksi yang tidak terlalu aneh
sumber
Untuk memperjelas beberapa aspek dan membuat JSLint Douglas Crockford tidak mengeluh tentang kode Anda, berikut adalah beberapa contoh instantiation:
Dalam contoh 3. ekspresi dalam (...) sebagai nilai adalah fungsi / konstruktor. Ini terlihat seperti ini: new (function () {...}) (). Jadi jika kita menghilangkan tanda kurung akhir seperti pada contoh 2, ekspresi tersebut masih merupakan panggilan konstruktor yang valid dan terlihat seperti contoh 4.
JSLint Douglas Crockford "berpikir" Anda ingin menetapkan fungsi ke someObj, bukan instance-nya. Dan bagaimanapun itu hanya peringatan, bukan kesalahan.
sumber