Ok fonksiyonlu ES6 alıcı / ayarlayıcı


106

Babel6 kullanıyorum ve evcil hayvan projem için kullanabileceğim yöntemler için XMLHttpRequest için bir sarmalayıcı oluşturuyorum:

open = (method, url, something) => {
  return this.xhr.open(method, url, something);
}

ancak özellikler için ok işlevi çalışmıyor

bu çalışıyor:

get status() { return this.xhr.status; }

ama kullanamam

get status = () => this.xhr.status;

Bu kasıtlı mı?


Kıvrımlı parantezlere veya dönüşe ihtiyacınız yok; sadece söyleyebilirsin (method, url, something) => this.xhr.open(method. url, something).

getbir nesne değişmezinin veya bir sınıf tanımının bir parçasıdır, bir değişken ataması değildir. Neden aynı şekilde çalışmaları gerektiğini düşünüyorsunuz?
Bergi

2
status => this.xhr.status(c # 7 sözdizimi) veya belki get status() => this.xhr.statusde okunabilirlik için harika bir sözdizimi şekeri olabilirdi, ancak Javascript, Typescript (henüz?) desteklemiyor
Charles HETIER

Yanıtlar:


113

ES2015 gramerine göre, değişmez bir nesne üzerindeki bir özellik yalnızca dört şeyden biri olabilir:

Mülkiyet Tanımı :

  • Tanımlayıcı Referans
  • ÖzellikAdı : AtamaExpression
  • Yöntem Tanım

Bir lider izin veren bu türden yalnızca bir getolan MethodDefinition :

Yöntem Tanım :

  • PropertyName ( StrictFormalParameters ) { FunctionBody }
  • GeneratorMethod
  • get PropertyName ( ) { FunctionBody }
  • set PropertyName ( PropertySetParameterList ) { FunctionBody }

Gördüğünüz gibi, getform , formda olması gereken çok sınırlı bir dilbilgisini takip ediyor

get NAME () { BODY }

Dilbilgisi, formun işlevlerine izin vermez get NAME = ....


Yardımın için teşekkürler, cevabını kabul ediyorum. Alıcı / ayarlayıcının bir atama ile kullanılamayacağının nerede tanımlandığını biliyor musunuz? Sadece merak.
Gabor Dolla

@GaborDolla ECMAScript spesifikasyonundaki nesne değişmez dilbilgisine başvurmak için düzenlendi.
apsillers

39

Kabul edilen cevap harika. Kompakt "ok işlevi sözdizimi" yerine normal işlev sözdizimini kullanmak istiyorsanız en iyisi budur .

Ama belki gerçekten ok işlevlerini seviyorsunuz; ok işlevini normal işlev sözdiziminin yerini alamayacağı başka bir nedenle kullanıyorsunuz ; farklı bir çözüme ihtiyacınız olabilir.

Örneğin, OP'nin kullandığını fark ettim this, sözcüksel olarak bağlanmakthis isteyebilirsiniz ; aka "bunun bağlayıcılığı yoktur" ) ve ok işlevleri sözlü bağlama için iyidir.

Yine de Object.definePropertyteknik yoluyla bir alıcı ile bir ok işlevini kullanabilirsiniz .

{
  ...
  Object.defineProperty(your_obj, 'status', { 
     get : () => this.xhr.status 
  });
  ...
}

Bkz bahseder object initializationtekniği (aka get NAME() {...}) vs definePropertytekniği (aka get : ()=>{}) . En az bir önemli fark vardır, kullanımı definePropertydeğişkenlerin zaten mevcut olmasını gerektirir:

Mevcut nesneler üzerinde alıcı tanımlama

yani (benim örneğimde) var olduğundan ve bir değişkene kaydedildiğinden Object.definePropertyemin olmalısınız your_obj(oysa bir ile object-initializationnesne başlatmanızda bir nesne değişmezi döndürebilirsiniz :) {..., get(){ }, ... }. Özellikle burada daha fazla bilgiObject.defineProperty

Object.defineProperty(...)get NAME(){...}sözdizimiyle karşılaştırılabilir bir tarayıcı desteğine sahip görünüyor ; modern tarayıcılar, IE 9.


11
Zekice, ama sonuçta sadece:get status() { return this.xhr.status; }
devuxer

2
@devuxer Çok ayrıntılı olduğuna katılıyorum. Ancak açık olmak gerekirse , içinde tanımlandığınız nesne siz this olmalısınızget status() { ... } . Ama sözcüksel bağlama farklılıkları nedeniyle benim başka bir şey this olabilir , değil mi?
The Red Pea

2
Katılıyorum ... Pratikte olsa da, thiserişimci olarak istediğim şeyin olmadığı bir vakayla karşılaşmadım . ( thisOk işlevlerinin bağlayıcı faydaları, olay işleyicileri ve geri aramalarda olduğu gibi işlevler
iletilirken

3
Ben sık sık şişman ok + sözcük bağlamaları kullanmak, kabul ediyorum ()=>{}ben geçmek geri aramalar için Promise gibi $http(...).then((promise_result)=> this...})). Şişman ok kullanmazsam this, global Windownesneyi temsil eder ; pek kullanışlı değil. Ama ben nadiren (asla?) Söylediğiniz ()=>{}gibi bir "erişimci alma" işlevi olarak kullandım ... en azından thisiçinde tanımlı get()nesneyi temsil edecek get()(ki bu zaten daha kullanışlıdır Window; yani kullanmaya gerek yoktur) şişman ok işlevi!)
The Red Pea

1
definePropertyYaklaşım döngüler yararlıdır. Şu anda, onu, içerdiği nesneden bir chiled nesnenin bazı özelliklerini ortaya çıkarmak için kullandım.
Edurne Pascual
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.