對於ES6類,我們有getter和setter屬性,但沒有字段選項(或至少我知道的)。JS類字段
使用Object.defineProperty
,您可以使用value
屬性設置它們。如果有的話,你如何在課堂上做同樣的事情?
我知道它可以在類的構造函數中完成,但如果可能我希望它是分開的。
對於ES6類,我們有getter和setter屬性,但沒有字段選項(或至少我知道的)。JS類字段
使用Object.defineProperty
,您可以使用value
屬性設置它們。如果有的話,你如何在課堂上做同樣的事情?
我知道它可以在類的構造函數中完成,但如果可能我希望它是分開的。
你在上面說「他們是同一件事,不管語言如何」。
嗯,是的,沒有。
是的,編程語言之間有明顯的關係,但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');
}
}
你的傳輸代碼中的'name'來自哪裏? – Bergi
@Bergi我的原始代碼的稍後版本。現在糾正了。 – lonesomeday
謝謝。使它更加明顯是多麼毫無意義的課堂領域:-) – Bergi
我不明白這個問題,你能舉一個例子說明「它可以在課堂上完成嗎?構造函數「,所以我們可以看到你在找什麼? – lonesomeday
@lonesomeday在類的構造函數中,this.whatever ='someValue';' – Spedwards
所以你的意思是對象屬性?」類字段「不是存在於JS中的概念。 – lonesomeday