function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
}
Za dobrou praxi se považuje pojmenování funkcí konstruktoru velkým prvním písmenem.
Ve funkci konstruktoru toto
nemá hodnotu. Je to náhrada za nový objekt. Hodnota toto
se stane novým objektem, když je vytvořen nový objekt.
Výukový tento JavaScript
Příklady z předchozích kapitol jsou omezené. Vytvářejí pouze jednotlivé objekty.
Někdy potřebujeme "návrh" pro vytvoření mnoha objektů stejného "typu".
Způsob, jak vytvořit "typ objektu", je použít funkci konstruktoru objektu.
Ve výše uvedeném příkladu je funkce Person()
funkcí konstruktoru objektu.
Objekty stejného typu se vytvářejí voláním funkce konstruktoru s klíčovým slovem new
:
const myFather = new Person("John", "Doe", 50, "blue");
const myMother = new Person("Sally", "Rally", 48, "green");
V JavaScriptu odkazuje klíčové slovo toto
na objekt.
Který objekt závisí na tom, jak je tento
vyvolán (použit nebo zavolán).
Klíčové slovo toto
odkazuje na různé objekty v závislosti na tom, jak se používá:
V objektové metodě toto
odkazuje na objekt.
Samotné toto
odkazuje na globální objekt.
Ve funkci toto
odkazuje na globální objekt.
Ve funkci je v přísném režimu toto
nedefinováno
.
V události toto
odkazuje na prvek, který přijal událost.
Metody jako call()
, apply()
a bind()
může odkazovat toto
na jakýkoli objekt.
toto
není proměnná. Je to klíčové slovo. Hodnotu toto
nelze změnit.
Výukový tento JavaScript
Přidání nové vlastnosti k existujícímu objektu je snadné:
myFather.nationality = "English";
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p id="demo"></p>
<script>
// Constructor function for Person objects
function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
}
// Create 2 Person objects
const myFather = new Person("John", "Doe", 50, "blue");
const myMother = new Person("Sally", "Rally", 48, "green");
// Add nationality to first object
myFather.nationality = "English";
// Display nationality
document.getElementById("demo").innerHTML =
"My father is " + myFather.nationality;
</script>
</body>
</html>
Vlastnost bude přidána do myFather. Ne mé matce. (Ne namítá žádné jiné osobě).
Přidání nové metody do existujícího objektu je snadné:
myFather.name = function () {
return this.firstName + " " + this.lastName;
};
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p id="demo"></p>
<script>
// Constructor function for Person objects
function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
}
// Create 2 Person objects
const myFather = new Person("John", "Doe", 50, "blue");
const myMother = new Person("Sally", "Rally", 48, "green");
// Add a name method to first object
myFather.name = function() {
return this.firstName + " " + this.lastName;
};
// Display full name
document.getElementById("demo").innerHTML =
"My father is " + myFather.name();
</script>
</body>
</html>
Metoda bude přidána do myFather. Ne mé matce. (Ne namítá žádné jiné osobě).
Do konstruktoru objektu nemůžete přidat novou vlastnost stejným způsobem jako vy přidat novou vlastnost k existujícímu objektu:
Person.nationality = "English";
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p>You cannot add a new property to a constructor function.</p>
<p id="demo"></p>
<script>
// Constructor function for Person objects
function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
}
// You can NOT add a new property to a constructor function
Person.nationality = "English";
// Create 2 Person objects
const myFather = new Person("John", "Doe", 50, "blue");
const myMother = new Person("Sally", "Rally", 48, "green");
// Display nationality
document.getElementById("demo").innerHTML =
"The nationality of my father is " + myFather.nationality;
</script>
</body>
</html>
Chcete-li přidat novou vlastnost do konstruktoru, musíte ji přidat do funkce konstruktoru:
function Person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
this.nationality = "English";
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p id="demo"></p>
<script>
// Constructor function for Person objects
function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
this.nationality = "English";
}
// Create 2 Person objects
const myFather = new Person("John", "Doe", 50, "blue");
const myMother = new Person("Sally", "Rally", 48, "green");
// Display nationality
document.getElementById("demo").innerHTML =
"My father is " + myFather.nationality + ". My mother is " + myMother.nationality;
</script>
</body>
</html>
Tímto způsobem mohou mít vlastnosti objektu výchozí hodnoty.
Vaše funkce konstruktoru může také definovat metody:
function Person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
this.name = function() {
return this.firstName + " " + this.lastName;
};
}
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p id="demo"></p>
<script>
// Constructor function for Person objects
function Person(first, last, age, eye) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eye;
this.name = function() {
return this.firstName + " " + this.lastName
};
}
// Create a Person object
const myFather = new Person("John", "Doe", 50, "blue");
// Display full name
document.getElementById("demo").innerHTML =
"My father is " + myFather.name();
</script>
</body>
</html>
Do konstruktoru objektu nemůžete přidat novou metodu stejným způsobem, jako přidáváte a novou metodu k existujícímu objektu.
Přidání metod do konstruktoru objektu musí být provedeno uvnitř funkce konstruktoru:
function Person(firstName, lastName, age, eyeColor) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.eyeColor = eyeColor;
this.changeName = function (name) {
this.lastName = name;
};
}
Funkce changeName() přiřadí hodnotu jména osobě vlastnost příjmení.
myMother.changeName("Doe");
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p id="demo"></p>
<script>
// Constructor function for Person objects
function Person(firstName,lastName,age,eyeColor) {
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
this.eyeColor = eyeColor;
this.changeName = function (name) {
this.lastName = name;
}
}
// Create a Person object
const myMother = new Person("Sally","Rally",48,"green");
// Change last name
myMother.changeName("Doe");
// Display last name
document.getElementById("demo").innerHTML =
"My mother's last name is " + myMother.lastName;
</script>
</body>
</html>
JavaScript ví, kdo jste mluvit o "nahrazením" toto za moje matka.
JavaScript má vestavěné konstruktory pro nativní objekty:
new String() // A new String object
new Number() // A new Number object
new Boolean() // A new Boolean object
new Object() // A new Object object
new Array() // A new Array object
new RegExp() // A new RegExp object
new Function() // A new Function object
new Date() // A new Date object
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<h2>JavaScript Object Constructors</h2>
<p id="demo"></p>
<script>
const x1 = new String(); // A new String object
const x2 = new Number(); // A new Number object
const x3 = new Boolean(); // A new Boolean object
const x4 = new Object(); // A new Object object
const x5 = new Array(); // A new Array object
const x6 = new RegExp(); // A new RegExp object
const x7 = new Function(); // A new Function object
const x8 = new Date(); // A new Date object
// Display the type of all objects
document.getElementById("demo").innerHTML =
"x1: " + typeof x1 + "<br>" +
"x2: " + typeof x2 + "<br>" +
"x3: " + typeof x3 + "<br>" +
"x4: " + typeof x4 + "<br>" +
"x5: " + typeof x5 + "<br>" +
"x6: " + typeof x6 + "<br>" +
"x7: " + typeof x7 + "<br>" +
"x8: " + typeof x8 + "<br>";
</script>
<p>There is no need to use new String(), new Number(), new Boolean(), new Array(), and new RegExp()</p>
<p>Use literals instead like: myArray = []</p>
</body>
</html>
Objekt Math()
není v seznamu. Math
je globální objekt. Klíčové slovo new
nelze použít na Matematika
.
Jak můžete vidět výše, JavaScript má objektové verze primitiva datové typy Řetězec
, Číslo
a Boolean
. Není ale důvod vytvářet složité objekty. Primitivní hodnoty jsou mnohem rychlejší:
Místo new String()
použijte řetězcové literály ""
.
Místo new Number()
použijte číselné literály 50
.
Místo new Boolean()
použijte booleovské literály true/false
.
Místo new Object()
použijte objektové literály {}
.
Místo new Array()
použijte literály pole []
.
Místo nové RegExp()
použijte vzorové literály /()/
.
Místo new Function()
použijte funkční výrazy () {}
.
let x1 = ""; // new primitive string
let x2 = 0; // new primitive number
let x3 = false; // new primitive boolean
const x4 = {}; // new Object object
const x5 = []; // new Array object
const x6 = /()/ // new RegExp object
const x7 = function(){}; // new function
Zkuste to sami →
<!DOCTYPE html>
<html>
<body>
<p id="demo"></p>
<script>
let x1 = ""; // string
let x2 = 0; // number
let x3 = false; // boolean
const x4 = {}; // Object object
const x5 = []; // Array object
const x6 = /()/; // RegExp object
const x7 = function(){}; // function
// Display the type of all
document.getElementById("demo").innerHTML =
"x1: " + typeof x1 + "<br>" +
"x2: " + typeof x2 + "<br>" +
"x3: " + typeof x3 + "<br>" +
"x4: " + typeof x4 + "<br>" +
"x5: " + typeof x5 + "<br>" +
"x6: " + typeof x6 + "<br>" +
"x7: " + typeof x7 + "<br>";
</script>
</body>
</html>
Normálně se řetězce vytvářejí jako primitiva: firstName="John"
Řetězce však lze také vytvořit jako objekty pomocí klíčového slova new
:
firstName=new String("John")
V této kapitole se dozvíte, proč by řetězce neměly být vytvářeny jako objekt JS řetězce.
Normálně se čísla vytvářejí jako primitiva: x=30
Čísla však lze také vytvořit jako objekty pomocí klíčového slova new
:
x=nové Číslo(30)
V této kapitole se dozvíte, proč by čísla neměla být vytvářena jako objekt JS čísla.
Normálně jsou booleany vytvářeny jako primitiva: x = nepravda
Booleany však lze vytvořit také jako objekty pomocí klíčového slova new
:
x=new Boolean(false)
V této kapitole se dozvíte, proč by se logické hodnoty neměly vytvářet jako objekt JS Booleans.