Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Diskussion des Prototypmusters in JavaScript

Eine kurze Diskussion des Prototypmusters in JavaScript

高洛峰
高洛峰Original
2016-11-25 09:27:451135Durchsuche

Es gibt viele Möglichkeiten, Objekte in JavaScript zu erstellen, z. B. Fabrikmuster, Konstruktormuster, Prototypmuster usw.:

//Werksmodus<br>function createPerson(name,age,job)<br>{<br> var o = new Object;<br> o.name = name;<br> o.age = age ;<br> o.job = job;<br> o.sayName = function()<br> {<br> alarm(this.name);<br> }<br> return o;<br>}<br>var person = createPerson('dw',20,'IT');<br><p><br></p><p><br></p><p><br></p> <p> Sein äquivalentes Prototypmuster: </p><p></p><p>function Person()<br>{<br><br>}<br>Person.prototype = <br>{<br> name :"dw",<br> Alter:20,<br> Job:"IT",<br> sayName:function()<br> {<br> alarm(this.name);<br> }<br> };<br>var person2 = new Person;<br><br> In Javascript verfügt jede Funktion über ein Prototypattribut, das ein Zeiger auf das Prototypobjekt ist und zum Erstellen der Summe der von allen Instanzen gemeinsam genutzten Attribute verwendet werden kann. Verfahren. Erstellen Sie im Prototypmodus eine Instanz person3</p><p><br></p><p></p><p>var person3 = new Person;<br>person2.name; //dw<br> person3. name; //dw<br><br>Die Namensattribute von person2 und person3 geben beide dw zurück. Die Eigenschaften und Methoden eines Prototypobjekts werden von allen Instanzen eines bestimmten Typs gemeinsam genutzt. Standardmäßig erhält jedes Prototypobjekt automatisch ein Konstruktorattribut, das verwendet wird, um auf den Zeiger auf die Funktion zu verweisen, in der sich das Prototypattribut befindet, z. B. Person.prototype.constructor zeigt auf Person</p><p><br> </p><p> </p><p>alert(Person.prototype.constructor); //Gib den Konstruktor von Person zurück<br>//Person.prototype.constructor ist nur ein Zeiger auf Person und ist nicht gleich Person <br>//Following Both return false<br>alert(Person.prototype.constructor === Person)<br>alert(Person.prototype.constructor == Person)<br><br>Die Dreiecksbeziehung zwischen Instanzen , Prototypobjekte und Konstruktoren lauten wie folgt. Wie in der Abbildung gezeigt: </p><p><img src="https://img.php.cn//upload/image/628/727/400/1480037228955873.png" title="1480037228955873.png" alt="Eine kurze Diskussion des Prototypmusters in JavaScript"></p><p> In jeder Instanz gibt es einen Zeiger, der auf das Prototypobjekt zeigt, das als [[Prototyp] bezeichnet wird. ] in der fünften Ausgabe von ECMA-262. Im Prototypmodus erstellte Instanzen haben keine direkte Beziehung zu Konstruktoren. </p><p><br></p><p> Obwohl auf [[prototype]] nicht zugegriffen werden kann, können Sie die Methode isPrototypeOf() verwenden, um festzustellen, ob das Objekt ein Prototypobjekt ist. </p><p></p><p>alert(Person.prototype.isPrototypeOf(person2)); //true<br>alert(Person.prototype.isPrototypeOf(person3));//true<br><br>Da es in der Instanz einen Zeiger auf Person.prototype gibt, geben sie alle true zurück. In ECMAScript 5 können Sie Object.getPrototypeOf() verwenden, um [[prototype]] zurückzugeben, also das Prototypobjekt </p><p><br></p><p></p><p>alert( Object.getPrototypeOf( person2) == Person.prototype); //true<br>alert(Object.getPrototypeOf(person2).name); //dw<br><br> Hinweis: Sie können zwar Instanzen verwenden, um auf die zuzugreifen Wenn Sie Werte im Prototyp angeben, können Sie den Wert im Prototyp nicht über die Instanz überschreiben. Wenn Sie also eine Eigenschaft mit demselben Namen wie der Prototyp in der Instanz hinzufügen, wird die Eigenschaft mit demselben Namen im Prototyp blockiert. </p><p><br></p><p></p><p>person2.name="qs";<br>alert(person2.name);//qs<br><br>Auch wenn Wenn das Namensattribut auf Null gesetzt ist, kann auf den Namen im Prototyp immer noch nicht zugegriffen werden. Mit „delete“ können Sie das Namensattribut der Instanz löschen und dann den Namen im Prototyp erneut aufrufen.</p><p><br></p><p></p><p></p><pre name="code" class=" html">person2.name = null;<br>alert(person2.name); //null<br>delete person2.name;alert(person2.name); //dw<br> <br> <p><br></p><p><br> Für eine Eigenschaft mit demselben Namen können Sie die Methode hasOwnProperty("propertyName") verwenden, um zu erkennen, ob die Eigenschaft zu einer Instanz oder gehört ein Prototyp. Diese Methode gibt nur zurück, wenn die angegebene Eigenschaft in der Instanz vorhanden ist</p>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn