2017-04-04 12 views
0

對於ES6類,我們有getter和setter屬性,但沒有字段選項(或至少我知道的)。JS類字段

使用Object.defineProperty,您可以使用value屬性設置它們。如果有的話,你如何在課堂上做同樣的事情?

我知道它可以在類的構造函數中完成,但如果可能我希望它是分開的。

+0

我不明白這個問題,你能舉一個例子說明「它可以在課堂上完成嗎?構造函數「,所以我們可以看到你在找什麼? – lonesomeday

+0

@lonesomeday在類的構造函數中,this.whatever ='someValue';' – Spedwards

+1

所以你的意思是對象屬性?」類字段「不是存在於JS中的概念。 – lonesomeday

回答

3

你在上面說「他們是同一件事,不管語言如何」。

嗯,是的,沒有。

是的,編程語言之間有明顯的關係,但Javascript/ECMAScript有一些不尋常的功能。不要只是期待完全翻譯的概念。

關鍵是Javascript不是基於類的,儘管它沒有類類語法。它是基於原型的。這意味着你可以在任何對象上聲明任何屬性。您不需要將其包含在類聲明中。

由於這個原因,ES6標準中沒有包含「class fields」。預計您會將它們包含在constructor方法中,就像在ES6之前的Javascript中一樣。

有建議創建public class fields。這將是這個樣子:

class Dog { 
    constructor(name) { 
    this.name = name; 
    } 
    bark() { 
    console.log('woof'); 
    } 
    tail = new Tail() 
} 

然後,您可以有一些代碼是這樣的:

let benji = new Dog('Benji'); 
let rover = new Dog('Rover'); 
console.log(benji.bark === rover.bark); // true 
console.log(benji.tail === rover.tail); // false 

關鍵的一點是,每一個「實例」具有相同的方法。但是,每個「實例」具有不同的屬性。這是解釋爲什麼最初不包含此語法的區別。

作爲一項建議,目前不支持。但是,它可以用於轉譯。 Babel.js(與我寫的階段2預設一起將上面的代碼傳輸到這裏:

class Dog { 
    constructor(name) { 
    this.tail = new Tail(); 

    this.name = name; 
    } 
    bark() { 
    console.log('woof'); 
    } 
} 
+0

你的傳輸代碼中的'name'來自哪裏? – Bergi

+0

@Bergi我的原始代碼的稍後版本。現在糾正了。 – lonesomeday

+0

謝謝。使它更加明顯是多麼毫無意義的課堂領域:-) – Bergi