Saya menggunakan babel6 dan untuk proyek hewan peliharaan saya, saya membuat pembungkus untuk XMLHttpRequest, untuk metode yang dapat saya gunakan:
open = (method, url, something) => {
return this.xhr.open(method, url, something);
}
tetapi untuk fungsi panah properti tidak berfungsi
ini bekerja:
get status() { return this.xhr.status; }
tapi saya tidak bisa menggunakan
get status = () => this.xhr.status;
Apakah ini disengaja?
ecmascript-6
babeljs
Gabor Dolla
sumber
sumber
(method, url, something) => this.xhr.open(method. url, something)
.get
adalah bagian dari literal objek atau definisi kelas, tugas variabel bukan. Menurut Anda mengapa mereka harus bekerja sama?status => this.xhr.status
(c # 7 sintaks) atau mungkinget status() => this.xhr.status
memang akan menjadi gula sintaksis yang bagus untuk keterbacaan tetapi Javascript tidak Typecript (belum?) mendukungnyaJawaban:
Menurut tata bahasa ES2015, properti pada literal objek hanya dapat berupa satu dari empat hal:
Satu-satunya jenis yang memungkinkan pengarahan
get
adalah MethodDefinition :Seperti yang Anda lihat,
get
formulir mengikuti tata bahasa yang sangat terbatas yang harus ada di formulirTata bahasa tidak mengizinkan fungsi formulir
get NAME = ...
.sumber
Jawaban yang diterima bagus. Ini yang terbaik jika Anda ingin menggunakan sintaks fungsi normal daripada "sintaks fungsi panah" yang ringkas.
Tapi mungkin Anda sangat menyukai fungsi panah; mungkin Anda menggunakan fungsi panah untuk alasan lain yang tidak dapat diganti oleh sintaks fungsi normal ; Anda mungkin membutuhkan solusi yang berbeda.
Misalnya, saya perhatikan penggunaan OP
this
, Anda mungkin ingin mengikatthis
secara leksikal; alias "tidak mengikat ini" ), dan fungsi panah baik untuk pengikatan leksikal itu.Anda masih bisa menggunakan fungsi panah dengan getter melalui
Object.defineProperty
teknik ini.{ ... Object.defineProperty(your_obj, 'status', { get : () => this.xhr.status }); ... }
Lihat menyebutkan
object initialization
teknik (aliasget NAME() {...}
) vsdefineProperty
teknik (aliasget : ()=>{}
) . Setidaknya ada satu perbedaan signifikan, menggunakandefineProperty
membutuhkan variabel yang sudah ada:yaitu dengan
Object.defineProperty
Anda harus memastikan bahwayour_obj
(dalam contoh saya) ada dan disimpan ke dalam variabel (sedangkan denganobject-initialization
Anda dapat mengembalikan objek-literal dalam inisialisasi objek Anda :){..., get(){ }, ... }
. Info lebih lanjutObject.defineProperty
secara khusus, di siniObject.defineProperty(...)
tampaknya memiliki dukungan browser yang sebanding denganget NAME(){...}
sintaksis; browser modern, IE 9.sumber
get status() { return this.xhr.status; }
this
harus menjadi objek yang Andaget status() { ... }
definisikan. Tapi sayathis
bisa menjadi sesuatu yang lain, karena perbedaan ikatan leksikal, bukan?this
bukan yang saya inginkan dalam mendapatkan aksesor. (this
Manfaat yang mengikat dari fungsi panah tampaknya ikut bermain ketika meneruskan fungsi, seperti halnya dengan penangan acara dan panggilan balik.)()=>{}
untuk callback yang saya berikan ke Promise , seperti$http(...).then((promise_result)=> this...}))
. Jika saya tidak menggunakan panah lemak,this
akan mewakiliWindow
objek global ; tidak terlalu berguna. Tapi saya jarang (tidak pernah?) Telah menggunakan()=>{}
fungsi untuk "get accessor" seperti yang Anda katakan ... setidaknyathis
di dalamget()
akan mewakili objek yangget()
didefinisikan (yang sudah lebih berguna daripadaWindow
; jadi tidak perlu menggunakan fungsi panah lemak!)defineProperty
Pendekatan berguna dalam loop. Saat ini saya hanya menggunakannya untuk mengekspos beberapa properti objek chiled dari yang mengandung.