Einführung in ECMascript5
Zunächst müssen wir herausfinden, dass ECMascript ein Gott-Ma ist. Wir wissen, dass JavaScript oder LiveScript ursprünglich von Netscape erstellt wurde, und später wurde auch Microsoft nach dem Erstellen von JScript verfolgt. Screcycease hat auch einen eigenen Cenvi. Auf diese Weise gibt es drei Versionen des Browser -Skripts, die ihre eigenen machen. Jeder versteht diesen chaotischen, daher wird das Problem der Standardisierung auf die Tagesordnung. Im Jahr 1997 wurde der auf JavaScript1.1 basierende Vorschlag an die Europäische Computerherstellervereinigung (Europäische Computer -Hersteller ein Sektor) vorgelegt. Schließlich entwickelten alle ECMA-262, einen neuen Skriptsprachstandard namens ECMascript. Im folgenden Jahr übernahm ISO/IEC (Internationale Organisation für Standardisierung und internationale Elektrotechnische Kommission) auch ECMAScript als Standard. Danach wird die Welt friedlich sein. Große Browserhersteller verwenden ECMAScript als Grundlage für die jeweilige Implementierung von JavaScript. Natürlich ist es nur das Fundament und wurde nicht vollständig verfolgt. Andernfalls hätten wir nicht so viele Probleme mit dem Browser -Kompatibilität.
Was ist ecmascript5? Wie der Name schon sagt, ist es die fünfte Version dieser seltsamen Sache, genau wie das iPhone 5. ECMascript3, das wir jetzt oft verwenden, gilt eher als echte Programmiersprache als als Spielzeug und ist sehr beliebt geworden.
Text:
Ich hatte schon immer ein falsches Verständnis von GET/SET, und ich denke, Get Set ist eine Objektattributmethode. Ich hatte auch viele Fragen, nachdem ich die Blogs anderer Leute gelesen hatte. Heute hat das System viele Tests durchgeführt und es schließlich herausgefunden. (Wenn Sie die Lese- und Schreiben von Demo -Tests selbst bestehen, können Sie mich gerne kritisieren und korrigieren.)
Der GET/SET -Accessor ist nicht die Eigenschaft eines Objekts, sondern die Eigenschaft einer Eigenschaft. Jeder muss klar unterscheiden. Funktionen werden nur intern verwendet, sodass sie nicht direkt in JavaScript zugegriffen werden können. Um anzuzeigen, dass die Eigenschaften interne Werte sind, sind in Klammern zwischen den beiden Teams wie [[Wert]] eingeschlossen.
1. Lassen Sie mich diese Eigenschaften von Attributen kurz vorstellen (hier ist eine einfache Bestätigung)
(1) Datenattribut - Die Position, die einen Datenwert enthält. Diese Position kann Werte lesen und schreiben.
Datenattribute haben vier Merkmale, die ihr Verhalten beschreiben:
[[Konfigurierbar]]: Ist es konfigurierbar?
[[Aufzählbar]: Ist es aufgezählt?
[[Beschreibbar]]: Ist es lesbar
[[Wert]]: Attributwert
(2) Attributattribut des Zubehörs - enthält keine Datenwerte, enthält eine Getter- und Setterfunktion (diese beiden Funktionen sind nicht erforderlich)
Accessoreigenschaften haben auch vier Merkmale, die ihr Verhalten beschreiben:
[[Konfigurierbar]]: Ist es konfigurierbar?
[[Aufzählbar]: Ist es aufgezählt?
[[GET]]: Die Funktion, die beim Lesen von Attributen aufgerufen wird, ist nicht definiert
[[Set]]: Die Funktion, die beim Schreiben von Attributen aufgerufen wird, ist nicht definiert
2. Hier konzentrieren wir uns auf die Einführung [[get]]/[set]] ist das, was wir GET/SET Accessor nennen
Sprechen wir zunächst über die Verhaltensmerkmale des im Buch erwähnten GET/SET -Accessor: Der Get/Set -Accessor kann ohne Definition gelesen und geschrieben werden. Sie können auch nur einen definieren. Wenn nur Get definiert ist, können die beschriebenen Attribute nur lesbar und nicht beschreibbar sein. Wenn nur festgelegt wird, können die beschriebenen Attribute nur geschrieben und nicht lesbar sein.
(1) Unsere ursprüngliche Get -Set -Methode lautet wie folgt:
Funktion foo (val) {var value = val; this.getValue = function () {return value;}; this.setValue = function (val) {value = val;};} var obj = new foo ("Hallo"); Alert (obj.getValue (); // "hello ubj.setVal) (" hi ");Der obige Code ist nur eine Get -Set -Methode, die mit dem Schließbereich implementiert ist. Beachten Sie, dass die Methode die Attributmethode des Instanzobjekts ist, nicht die Attributeigenschaft. Wenn nicht definiert, ist der Wertwert nicht zugänglich
Funktion foo (val) {var value = val;/* this.getValue = function () {return value;}; this.setValue = function (val) {value = val;};*/} var obj = new foo ("Hallo"); alert (obj.value); // undefiniertDie folgenden Beispiele sind auch Attributmethoden von Objekten, keine Attributeigenschaften.
var obj = {name: "John", get: function () {return this.age;} // Nur GET ist definiert, gesetzt ist nicht definiert, aber es kann trotzdem Attribute lesen, schreiben und nennen, selbst wenn es das Alter ist // Die hier definierte Methode beeinflusst die Get -Set -Attribute der Attribute nicht. Nur ein normales Objektattribut}; alert (obj.name); // John lesbar obj.name = "Jack"; // Wrichable Alert (obj.name); // Jack(2) Get/Setzen Sie Accessor als Eigenschaft des Accessor -Attributs.
Auch hier handelt es sich nicht um das Attribut eines Objekts, sondern entscheiden, ob das Attribut gelesen und geschrieben werden kann. Wenn nicht festgelegt, ist es in Ordnung, genau wie das normale Lesen und Schreiben (Eigenschaften können gelesen oder gelesen werden
Schreiben, lesen und schreiben Zugriff auf die Eigenschaft selbst)
Es gibt zwei Möglichkeiten, das Attribut GET /SET zu ändern:
A. Verwenden Sie Object.DefineProperty ()
var Object = {_ Name: "daisy"}; Object.DefineProperty (Objekt, "Name", {// Der Methodenname hier bedeutet, dass eine Name -Eigenschaft definiert ist (so kann auf Objekt zugegriffen werden. this._name;}}); alert (Object.Name); // "daisy" Object.name = "Jack"; // Nur der Getter -Accessor ist definiert, also ist das Schreiben ungültige Warnung (Objekt.Beachten Sie, dass der Eigenschaftsname in Object.DefineProperty (Object, Pro, {}) den von Object.Pro zugegriffenen Eigenschaften entsprechen muss.
B. Verwenden Sie das Keyword des GET SET:
var Object = {_ Name: "Daisy", get name () {// Der Methodenname hier bedeutet, dass ein Namensattribut definiert ist (so kann er über Object.name zugegriffen werden), nur der Getter -Accessor ist definiert, kein [Wert]] Wert wird definiert. Geben Sie dies zurück. Alert (Object.Name); // Daisy Die Methode, um den Unterstrich hier zu entfernen, ist Daisy; Außerdem ist es undefinedObject.name = "Jack"; // Nur der Getter -Accessor ist definiert, sodass es nur gelesen, aber nicht wachsam (Objekt.Name); // daisy gelesen, aber nicht schreiben kannDie beiden oben genannten Methoden sind gleichwertig. Beachten Sie, dass beide beiden oben genannten Methoden zwei Attribute im Objektobjekt haben: _Name (mit Anfangswert) Name (ohne Anfangswert), der über die Browserkonsole ersichtlich ist.
Wann ist dieses Namensattribut wirklich definiert? Wir wissen, dass Object.defineProperty (Object, Pro, {}) eine neue Eigenschaft Pro für das Objekt definieren kann. Da er pro () {}/set pro () {} und Object.DefineProperty (Objekt, Pro, {}) äquivalent ist, wird auch eine neue Eigenschaft Pro definiert. Aus diesem Grund gibt es zwei Eigenschaften im Objekt.
(3) Der Implementierungscode von GET und Setzen Sie Accessor in JavaScript in diesem Artikel: Bezogen auf die Implementierung von GET -and -Set -Accessors von Standardstandards: Angemessene Gedanken
Ich habe selbst ein Beispiel geschrieben
Funktion foo (val) {this.value = val; // Das Wertattribut ist definiert und nein _value} foo.prototype = {value (val) {// Beachten Sie, dass der Methodenname und der Attributname das gleiche sind. Das Attribut ist im Prototypen zurückgegeben._Value;}}; // Der Accessor kehrt zurück und legt sie fest. Warum kann es gelesen oder geschrieben werden? ? ? ? var obj = new foo ("Hallo"); Alert (obj.value); // "Hallo" obj.value = "yehoo"; Alarm (obj.value); // "yehoo"Um die obige Frage zu lösen, wurden viele Tests durchgeführt. Schauen wir sie uns nacheinander an:
Schauen Sie sich zuerst dieses Beispiel an. Nur die GET -Funktion ist im Prototyp definiert. Wenn Sie das Wertattribut in obj.value lesen, suchen Sie in der Instanz ohne es und finden Sie es dann im Prototyp. Die GET -Methode wird aufgerufen, die nur gelesen, aber nicht geschrieben werden kann.
function Foo(val){this._value=val;//The attribute here is underlined, initializes the _value attribute of the instance object, the _value attribute is readable and writable}Foo.prototype={// set value(val){// Note that the method name is the same as the attribute name, and the value attribute is defined in the prototype // this._value = val; //}, det Value () {// Der Methodenname entspricht dem Attributnamen, definiert das Wert -Attribut und sein Attribut im Prototypen zurück. var obj = new foo ("hello"); alert (obj.value); // Hallo greift auf den Wert im Prototyp auf das Attribut obj.value = "yehoo"; // definiert nur das Attribut des Namens des Namens, sodass es nur gelesen, aber nicht geschrieben wird. Das Schreiben ist ungültige Warnung (obj.value); // HalloWenn dies._Value aus dem Unterstrich im Konstruktor entfernt wird, definiert das im Prototyp definierte Wertattribut das GET -Attribut. Sie können das Lesen und Schreiben des Wertattributs immer noch steuern. Mit anderen Worten, wenn obj.value auf Attribute zugreift, wird die GET -Methode aufgerufen und zuerst im Objekt selbst gesucht, wenn nicht, dann im Prototyp suchen. Wenn nichts nicht ist, wird es als undefiniert angesehen. Der Standardwert ist sowohl lesbar als auch beschreibbar.
Funktion foo (val) {this.value = val; // Nur die Wertfunktion des Get -Werts ist im Prototyp definiert. Daher ist das Schreiben ungültig} foo.prototype = {// Wert (val) {// Beachten Sie, dass der Methodenname und den Attributnamen dieselbe Set -Funktion sind. Selbst wenn der Wertwert manuell geschrieben wird, kann der Wert nicht korrekt gelesen werden: "Hah" //, solange der Get Pro () {} und die Setze von Pro () {} Attributen deklariert werden, können sie gelesen und schreiben, aber wenn die Funktionsdefinition falsch ist, kann der korrekte Eigenschaftswert nicht zugegriffen werden. value () {// Der Methodenname entspricht dem Attributnamen. Das Wertattribut und sein GET -Attribut sind im Prototyp definiert. Return this._Value;}}; var obj = new foo ("hello"); // "Hallo" wurde nicht erfolgreich geschrieben (obj.value); // undefined obj.value = "yehoo"; // definierte nur das Get Attribut, sodass es nur gelesen, aber nicht geschrieben ist, und das Schreiben ist ungültig (obj.value); // Undefinierte Alt (Obj.value).Um zu beweisen, dass das obige Beispiel lesbar und nicht beschreibbar ist: Manuell schreiben _Value: "hah", können Sie den Wert lesen, können ihn aber nicht schreiben.
Funktion foo (val) {this.value = val; // Nur die Wertfunktion des Wertes ist im Prototyp definiert. Das Schreiben hier ist also ungültig} foo.prototype = {// Wert (val) {// Beachten Sie, dass der Methodenname und den Attributnamen dieselbe Set -Funktion sind. Selbst wenn der Wertwert manuell geschrieben wird, kann der Wert nicht korrekt gelesen werden: "Hah" //, solange der Get Pro () {} und die Setze von Pro () {} Attributen deklariert werden, können sie gelesen und schreiben, aber wenn die Funktionsdefinition falsch ist, kann der korrekte Eigenschaftswert nicht zugegriffen werden. value () {// Der Methodenname entspricht dem Attributnamen. Das Wertattribut und sein GET -Attribut sind im Prototyp definiert. Return this._Value;}}; var obj = new foo ("Hallo"); // "Hallo" wurde nicht erfolgreich geschrieben (obj.value); // "hah" obj.value = "yehoo"; // Nur das Get Attribut ist definiert, damit es nur gelesen werden kann, und das Schreiben ist ungültig (obj.value);Wenn der Wert: "hah" manuell geschrieben ist, kann ich mich bemühen, den Wert des Wertes zu lesen? Da dies von der GET -Methode nicht definiert ist, liest obj.value den Wertwert und Aufrufe det Value () {} -Methode, aber der Wert kann immer noch nicht geschrieben werden.
Funktion foo (val) {this.value = val; // Nur die Wertfunktion des Get -Werts ist im Prototyp definiert. Daher ist das Schreiben ungültig} foo.prototype = {// Wert (val) {// Beachten Sie, dass der Name und die Attributname dieselbe SET -Feature sind. Der Wertwert wird manuell geschrieben, da die GET -Methode dies zurückgibt. value () {// Der Methodenname und der Attributname sind gleich. Das Wertattribut und seine GET -Funktion sind im Prototyp definiert. Return this._Value;}}; var obj = new foo ("Hallo"); // "Hallo" wurde nicht erfolgreich aufmerksam gemacht (obj.value); // undfinierte Lesen Sie ungültig, solange obj.value, retektiert dies. Alarm (obj.value); // undefiniertWenn Sie sich dieses Beispiel ansehen, ist Get -Set definiert, gibt dies jedoch zurück. Sie können feststellen, dass der Wert gelesen und schriftlich gelesen werden kann. Entfernen Sie die Get -Set -Methode im Prototyp und kann weiterhin lesbar oder geschrieben werden
Funktion foo (val) {this.value = val;} foo.prototype = {set value (val) {this._value = val;}, det Value () {return this._value;}}; var obj = new foo ("hello"); alarm (obj.value); // Hallo obj.value = "yehoo"; alarm (obj.value); // yehoo foo foo (val) {this. Foo ("hello"); alarm (obj.value); // Hallo obj.value = "yehoo"; alert (obj.value); // yehooZusammenfassen
Nur das Attribut Get Pro () {} ist lesbar und nicht beschreibbar;
Deklarieren Sie nur das Set Pro () {} Attribut als schreibbar und unlesbar.
Wenn keine der Erklärungen deklariert wird, sind die Attribute lesbar und beschreibbar;
Wenn alle Erklärungen vorgenommen werden, lesen und schreiben Sie gemäß der durch Get -Set definierten Methode;
Wenn alle deklariert sind, aber die definierte Lese- und Schreibmethode nicht richtig gelesen und geschrieben werden kann, fällt GET/SET fehl. Werden Sie die Standard -Lesbar und schriftlich
Das im Prototyp definierte Wertattribut definiert das GET -Attribut. Sie können das Lesen und Schreiben des Wertattributs immer noch steuern. Mit anderen Worten, wenn obj.value auf Attribute zugreift, wird die GET -Methode aufgerufen, zuerst im Objekt selbst sucht und dann im Prototyp sucht. Wenn es nichts gibt, wird es als undefiniert angesehen. Der Standardwert ist sowohl lesbar als auch beschreibbar.
Wieder auffüllen:
Ob Get pro () {}/set pro () {} oder Object.DefineProperty (Objekt, Pro, {get: function () {return this.name;}});Pro kann nicht dasselbe wie zurück sein. Andernfalls wird der folgende Fehler gemeldet: (Ich weiß nicht warum, es scheint ein Stapelüberlauf zu sein, der durch meinen eigenen Anruf verursacht wird)
Nach der Korrektur des Meisters verstehe ich, warum der Fehler hier gemeldet wird: Wenn dieser Wert in der GET Value () {} -Methode zurückgegeben wird, wird die Wertmethode des GET erneut aufgerufen, wodurch in eine tote Schleife fällt, wodurch der Methodenstapel überflutet wird.