Heim > Web-Frontend > js-Tutorial > Hauptteil

Analysieren Sie die vier Möglichkeiten zum Erstellen von Objekten in Javascript

怪我咯
Freigeben: 2017-03-30 10:03:15
Original
1141 Leute haben es durchsucht

Vorwort

Es gibt viele Möglichkeiten, Objekte zu erstellen mit JavascriptJetzt Lassen Sie uns vier der Methoden auflisten und die Vor- und Nachteile jeder Methode auflisten, damit jeder einen Blick darauf werfen kann.

Fabrikmuster

function createPerson(name, age){
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 return obj; //一定要返回,否则打印undefined:undefined
 }
 var person1 = new createPerson('Young',18);
 console.log(person1.name + ':' + person1.age);
Nach dem Login kopieren

Vorteile: Fabrikmuster können das Problem der Erstellung mehrerer ähnlicher Muster lösen Objekte

Nachteile: Löst nicht das Problem der Objekterkennung (wie man den Typ eines Objekts bestimmt)

KonstruktorMuster

function Person(name,age){
 this.name = name;
 this.age = age;
 }
 var person1 = new Person('Young',18);
 console.log(person1.name + ':' + person1.age);
Nach dem Login kopieren

Bevor wir über die Vor- und Nachteile sprechen, erzählen wir zunächst eine kleine Geschichte über sich selbst

Verwenden Sie den Konstruktor als Funktion

function Person(name,age){
 this.name=name;
 this.age=age;
 this.sayName=function(){
 return this.name;
 }
 }
 
 //当做构造函数使用
 var person1 = new Person('Young', 18);
 person1.sayName();
 console.log(person1.name + ':' + person1.age);
 
 //当做普通函数调用
 Person('Wind', 18);
 console.log(window.sayName());
 
 //在另一个作用域中调用
 var obj = new Object();
 Person.call(obj, 'bird', 100);
 console.log(obj.sayName());
Nach dem Login kopieren

Vor- und Nachteile des Konstruktors

Vorteile: kann seine Instanzen als einen bestimmten Typ identifizieren

Nachteile: Jede Methode muss auf jeder Instanz neu erstellt werden. Natürlich können Sie es auch so ändern:

function Person(name, age){
 this.name = name;
 this.age = age;
 this.sayName = sayName;
 }
 function sayName(){
 return this.name;
 }
Nach dem Login kopieren


wird geändert, um die globale Funktion aufzurufen, sodass überhaupt keine Kapselung erfolgt. . . Das nächste Prototypmuster kann diesen Mangel ausgleichen

Prototypmuster

function Person(){
 
 }
 Person.prototype.name = 'Young';
 Person.prototype.age = 18;
 Person.prototype.sayName = function(){
 return this.name;
 }
 
 var person1 = new Person();
 console.log(person1.sayName());
 var person2 = new Person();
 console.log(person1.sayName());
 alert(person1.sayName === person2.sayName);
 //person1和person2访问的是同一组属性的同一个sayName()函数
Nach dem Login kopieren

Obwohl über Objektinstanzen darauf zugegriffen werden kann gespeichert in Der Wert im Prototyp, aber der Wert im Prototyp kann nicht durch das Instanzobjekt überschrieben werden

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var person1=new Person();
 var person2=new Person();
 person1.name='Wind';
 
 console.log(person1.sayName());//Wind
 console.log(person2.sayName());//Young
 alert(person1.sayName==person2.sayName);//true
Nach dem Login kopieren

Wenn wir

person1.sayName
Nach dem Login kopieren

aufrufen, werden zwei Suchvorgänge durchgeführt Wenn dies der Fall ist, sucht der Parser zunächst nach Attributen von

sayName
Nach dem Login kopieren

.

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var person1=new Person();
 var person2=new Person();
 
 person1.name='Wind';
 console.log(person1.sayName());//Wind
 console.log(person2.sayName());//Young
 
 delete person1.name;
 console.log(person1.sayName());//Young
 console.log(person2.sayName());//Young
Nach dem Login kopieren

Verwenden Sie die Methode

hasOwnPropertyType
Nach dem Login kopieren

, um zu erkennen, ob eine Eigenschaft im Prototyp oder in der Instanz vorhanden ist ist wahr, im Prototyp falsch.

Instanzattribute für Aufzählungsobjekte verwenden die

Object.keys()
Nach dem Login kopieren

-Methode

function Person(){
 
 }
 Person.prototype.name='Young';
 Person.prototype.age=18;
 Person.prototype.sayName=function(){
 return this.name;
 }
 
 var keys=Object.keys(Person.prototype);
 console.log(keys);//["name", "age", "sayName"]
Nach dem Login kopieren

Vor- und Nachteile von Prototypmustern

Vorteile: Keine Notwendigkeit, jede Methode bei jeder Instanz zu wiederholen

Nachteile: Nur ​​wenige Leute verwenden das Prototypmuster allein. . Das Problem ist im Detail aufgeführt

function Person(){
 
 }
 Person.prototype={
 constructor:Person,
 name:'Young',
 age:18,
 friends:['Big','Pig'],
 sayName:function(){
 return this.name;
 }
 };
 var p1=new Person();
 var p2=new Person();
 p1.friends.push('Mon');
 console.log(p1.friends);//["Big", "Pig", "Mon"]
 console.log(p2.friends);//["Big", "Pig", "Mon"]
Nach dem Login kopieren

Das liegt genau daran, dass Instanzen im Allgemeinen ihre eigenen Attribute haben und wir sie hier in

Person.prototype
Nach dem Login kopieren

einfügen, also Mit Durch die Änderung von p1 wird die gesamte Instanz einschließlich des Prototyps geändert. Nun, wir können Konstruktormuster und Prototypmuster in Kombination verwenden.

Verwenden Sie das Konstruktormuster und das Prototypmuster in Kombination

function Person(name,age){
 this.name=name;
 this.age=age;
 this.friends=['Big','Pig'];
 }
 Person.prototype={
 sayName:function(){
 return this.name;
 }
 };
 var p1=new Person('Young',18);
 var p2=new Person('Wind',78);
 p1.friends.push('Raganya');
 console.log(p1.friends);//["Big", "Pig", "Raganya"]
 console.log(p2.friends);//["Big", "Pig"]
 console.log(p1.friends==p2.friends);//false
 console.log(p1.sayName==p2.sayName);//true
Nach dem Login kopieren

Dieses Muster ist derzeit die am weitesten verbreitete und anerkannteste Methode zum Erstellen von Anpassungen. Ist ein Standardmodus, der zum Definieren von Referenztypen verwendet wird.

Zusammenfassung

Das obige ist der detaillierte Inhalt vonAnalysieren Sie die vier Möglichkeiten zum Erstellen von Objekten in Javascript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!