Heim  >  Artikel  >  Web-Frontend  >  5 js-Designmuster

5 js-Designmuster

零到壹度
零到壹度Original
2018-03-21 16:59:112801Durchsuche

Dieser Artikel stellt Ihnen hauptsächlich 5 js-Designmuster vor. Freunde, die sie benötigen, können darauf verweisen. Schauen wir uns das unten mit dem Herausgeber an.

1. Factory-Muster

Dies ist das Factory-Muster, das viele Probleme mit ähnlichen Objekten löst kein Endobjekt haben. Identifikationsproblem

function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas", 29, "Software Engineer");
var person2 = createPerson("Greg", 27, "Doctor");

2. Konstruktormuster

Der sayName in jeder Instanz des Konstruktormusters ist anders, also wurde die Prototypkette

function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

hasOwnProperty()-Methode eingeführt, um zu erkennen, ob eine Eigenschaft in der Instanz oder im Prototyp vorhanden ist. true ist die Instanz und false ist der Prototyp

3. Prototypmodus

function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
person1.name = "Greg";
alert(person1.name); //"Greg"——来自实例
alert(person2.name); //"Nicholas"——来自原型
delete person1.name;
alert(person1.name); //"Nicholas" ——

Der Name von Person1 wird durch einen neuen Wert blockiert. Aber ob beim Zugriff auf person1.name oder person2.name der Wert normal zurückgegeben werden kann

function Person(){
}
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
alert(person1.hasOwnProperty("name")); //false
alert("name" in person1); //true
person1.name = "Greg";
alert(person1.name); //"Greg" ——来自实例
alert(person1.hasOwnProperty("name")); //true
alert("name" in person1); //true
alert(person2.name); //"Nicholas" ——来自原型
alert(person2.hasOwnProperty("name")); //false
alert("name" in person2); //true
delete person1.name;
alert(person1.name); //"Nicholas" ——来自原型
alert(person1.hasOwnProperty("name")); //false
alert("name" in person1); //true

Während des gesamten Prozesses der obigen Codeausführung wird entweder direkt auf das Namensattribut des Objekts zugegriffen Entweder Zugriff über Prototyp
. Daher gibt der Aufruf von „name“ in person1 immer „true“ zurück, unabhängig davon, ob die Eigenschaft in der Instanz oder im Prototyp vorhanden ist.
Durch gleichzeitige Verwendung der Methode hasOwnProperty() und des Operators in können Sie feststellen, ob die Eigenschaft im Objekt oder im
Prototyp vorhanden ist, wie unten gezeigt.
Das Namensattribut ist zuerst im Prototyp vorhanden , also gibt hasPrototypeProperty() true zurück
Die Eigenschaft existiert in der Instanz, also gibt hasPrototypeProperty() false zurück
Wenn der Prototypmodus als

Person.prototype = {
constructor: Person,
name : "Nicholas",
age : 29,
job : "Software Engineer",
friends : ["Shelby", "Court"],
sayName : function () {
alert(this.name);
}
}

geschrieben wird, muss das obige Format vorliegen als Konstruktor geschrieben, andernfalls zeigt der Funktionskonstruktor auf Fenster

var friend = new Person();
alert(friend instanceof Object); //true
alert(friend instanceof Person); //true
alert(friend.constructor == Person); //false
alert(friend.constructor == Object); //true

4. Muster der Verwendung von Konstruktor und Prototyp in Kombination

function Person(name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["Shelby", "Court"];
}
Person.prototype = {
constructor : Person,
sayName : function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");
person1.friends.push("Van");
alert(person1.friends); //"Shelby,Count,Van"
alert(person2.friends); //"Shelby,Count"
alert(person1.friends === person2.friends); //false
alert(person1.sayName === person2.sayName); //true

5. Dynamischer Prototypmodus

function Person(name, age, job){
//属性
this.name = name;
this.age = age;
this.job = job
// 方法
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
}
var friend = new Person("Nicholas", 29, "Software Engineer");
friend.sayName();

Dieser Code wird nur ausgeführt, wenn der Konstruktor aufgerufen wird erstmals. Danach ist der Prototyp initialisiert und es sind keine weiteren Änderungen erforderlich. Beachten Sie jedoch, dass hier am Prototyp vorgenommene Änderungen sofort in allen Fällen wirksam werden.
Bei Verwendung des dynamischen Prototypmodus können Objektliterale nicht zum Überschreiben des Prototyps verwendet werden. Wie bereits erläutert, wird die Verbindung zwischen der vorhandenen Instanz und dem neuen Prototyp unterbrochen, wenn Sie einen Prototyp überschreiben, obwohl bereits eine Instanz erstellt wurde.

Das obige ist der detaillierte Inhalt von5 js-Designmuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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