För att skapa ett klassarv, använd extends
nyckelord.
En klass skapad med ett klassarv ärver alla metoder från en annan klass:
Skapa en klass som heter "Model" som kommer att ärva metoderna från "Car" klass:
class Car {
constructor(brand) {
this.carname =
brand; }
present() {
return 'I have a ' + this.carname; }
}
class Model extends Car { constructor(brand, mod) {
super(brand);
this.model = mod; }
show() {
return this.present() + ', it is a ' + this.model; }
}
let myCar = new Model("Ford", "Mustang");
document.getElementById("demo").innerHTML
= myCar.show();
Prova själv →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Class Inheritance</h1>
<p>Use the "extends" keyword to inherit all methods from another class.</p>
<p>Use the "super" method to call the parent's constructor function.</p>
<p id="demo"></p>
<script>
class Car {
constructor(brand) {
this.carname = brand;
}
present() {
return 'I have a ' + this.carname;
}
}
class Model extends Car {
constructor(brand, mod) {
super(brand);
this.model = mod;
}
show() {
return this.present() + ', it is a ' + this.model;
}
}
const myCar = new Model("Ford", "Mustang");
document.getElementById("demo").innerHTML = myCar.show();
</script>
</body>
</html>
Metoden super()
hänvisar till föräldern klass.
Genom att anropa metoden super()
i konstruktormetod kallar vi förälderns konstruktormetod och får tillgång till förälderns egenskaper och metoder.
Arv är användbart för återanvändbarhet av kod: återanvänd egenskaper och metoder för en befintlig klass när du skapar en ny klass.
Klasser låter dig också använda getters och setters.
Det kan vara smart att använda getters och seters för dina fastigheter, speciellt om du vill göra något speciellt med värdet innan du returnerar dem, eller innan du ställer in dem.
För att lägga till getters och seters i klassen, använd hämta
och set
nyckelord.
Skapa en getter och en seter för egenskapen "carname":
class Car {
constructor(brand) {
this.carname
= brand;
}
get cnam() {
return this.carname;
}
set cnam(x) {
this.carname = x;
}
}
const myCar = new Car("Ford");
document.getElementById("demo").innerHTML = myCar.cnam;
Prova själv →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Class Getter/Setter</h1>
<p>A demonstration of how to add getters and setters in a class, and how to use the getter to get the property value.</p>
<p id="demo"></p>
<script>
class Car {
constructor(brand) {
this.carname = brand;
}
get cnam() {
return this.carname;
}
set cnam(x) {
this.carname = x;
}
}
const myCar = new Car("Ford");
document.getElementById("demo").innerHTML = myCar.cnam;
</script>
</body>
</html>
Obs! även om gettern är en metod använder du inte parenteser när du vill få fastighetsvärdet.
Namnet på getter/setter-metoden kan inte vara detsamma som namnet på egenskap, i det här fallet bilnamn
.
<p>Många programmerare använder ett understreckstecken _
före egenskapsnamnet för att skilja getter/setter från den faktiska egenskapen:
Du kan använda understrecket för att separera getter/setter från faktisk egendom:
class Car {
constructor(brand) {
this._carname
= brand;
}
get carname() {
return this._carname;
}
set carname(x) {
this._carname = x;
}
}
const myCar = new Car("Ford");
document.getElementById("demo").innerHTML = myCar.carname;
Prova själv →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Class Getter/Setter</h1>
<p>Using an underscore character is common practice when using getters/setters in JavaScript, but not mandatory, you can name them anything you like, but not the same as the property name.</p>
<p id="demo"></p>
<script>
class Car {
constructor(brand) {
this._carname = brand;
}
get carname() {
return this._carname;
}
set carname(x) {
this._carname = x;
}
}
const myCar = new Car("Ford");
document.getElementById("demo").innerHTML = myCar.carname;
</script>
</body>
</html>
För att använda en setter, använd samma syntax som när du anger ett egenskapsvärde, utan parentes:
Använd en setter för att ändra bilnamnet till "Volvo":
class Car {
constructor(brand) {
this._carname
= brand;
}
get carname() {
return this._carname;
}
set carname(x) {
this._carname = x;
}
}
const myCar = new Car("Ford");
myCar.carname = "Volvo";
document.getElementById("demo").innerHTML = myCar.carname;
Prova själv →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Class Setters</h1>
<p>When using a setter to set a property value, you do not use parantheses.</p>
<p id="demo"></p>
<script>
class Car {
constructor(brand) {
this._carname = brand;
}
set carname(x) {
this._carname = x;
}
get carname() {
return this._carname;
}
}
const myCar = new Car("Ford");
myCar.carname = "Volvo";
document.getElementById("demo").innerHTML = myCar.carname;
</script>
</body>
</html>
Till skillnad från funktioner och andra JavaScript-deklarationer, hissas inte klassdeklarationer.
Det betyder att du måste deklarera en klass innan du kan använda den:
//You cannot use the class yet.
//myCar = new Car("Ford") will raise an error.
class Car { constructor(brand) {
this.carname = brand; }
}
//Now you can use the class:
const myCar = new Car("Ford")
Prova själv →
<!DOCTYPE html>
<html>
<body>
<h1>JavaScript Classes are not Hoisted</h1>
<p>You will get an error if you try to use a class before it is declared.</p>
<p id="demo"></p>
<script>
//You cannot use the class yet.
//myCar = new Car("Ford") will raise an error.
class Car {
constructor(brand) {
this.carname = brand;
}
}
//Now you can use the class:
const myCar = new Car("Ford");
document.getElementById("demo").innerHTML = myCar.carname;
</script>
</body>
</html>
Obs: För andra deklarationer, som funktioner, får du INTE en fel när du försöker använda det innan det deklareras, eftersom standardbeteendet av JavaScript-deklarationer lyfts (flyttar deklarationen till toppen).