Heim Web-Frontend js-Tutorial JS objektorientiert (3) Objektklasse, statische Eigenschaften, Schließungen, private Eigenschaften, Verwendung von Call und Apply, drei Implementierungsmethoden für Vererbung_Javascript-Fähigkeiten

JS objektorientiert (3) Objektklasse, statische Eigenschaften, Schließungen, private Eigenschaften, Verwendung von Call und Apply, drei Implementierungsmethoden für Vererbung_Javascript-Fähigkeiten

May 16, 2016 pm 03:13 PM

1.Objektklasse

In JS ist Object die Basisklasse aller Klassen. Wenn Sie die Object-Klasse zum Erstellen eines benutzerdefinierten Objekts verwenden, müssen Sie keinen Konstruktor (Konstruktor, Prototyp, hasOwnProperty(property)) definieren

var per = new Object();
per.name = 'zhangsan';
per.age = ;
alert(per.name + per.age);
Nach dem Login kopieren

Wir möchten eine Objektvariable in das Programm aufnehmen, sofern diese eine große Datenmenge speichern kann. Zu diesem Zeitpunkt können wir die Verwendung der Object-Klasse in Betracht ziehen. Die Object-Klasse vermeidet die Definition eines Konstruktors. Eine weitere häufig verwendete Eigenschaft unter der Object-Klasse: hasOwnProperty

var per = new Object();
per.name = 'zhangsan';
per.age = ;
if per.hasOwnProperty('email'){
alert('具有email');
}else{
alert('无email');
}
Nach dem Login kopieren

2. Statische Attribute

In einigen objektorientierten Sprachen können Sie das Schlüsselwort static verwenden, um statische Eigenschaften oder statische Methoden einer Klasse zu definieren, die in JS simuliert werden können.

Syntax:

Klassenname.Attributname

Klassenname.Attribute=function(){}

function Person(){
}
Person.count = ;
var p = new Person();
Person.count++;
var p = new Person();
Person.count++;
var p = new Person();
Person.count++;
alert(Person.count);

Nach dem Login kopieren

Statische Eigenschaften und statische Methoden hinzufügen:

function Person(){
Person.count++; //静态属性
Person.getCount=function(){ //静态方法
alert('当前共有' + Person.count + '个人');
}
}
Person.count = ;
var p = new Person();
var p = new Person();
var p = new Person();
Person.getCount();

Nach dem Login kopieren

3. Schließung

Konzept: Der sogenannte Abschluss bezieht sich auf einen Ausdruck (normalerweise eine Funktion), der viele Variablen und eine an diese Variablen gebundene Umgebung hat, sodass diese Variablen auch Teil des Ausdrucks sind.

Stellen Sie eine Frage:

function display(){
var i=; 
}
display();
//在这里,想访问局部变量i
Nach dem Login kopieren

In der globalen Welt kann nicht auf die lokale Variable i zugegriffen werden, da der Gültigkeitsbereich unterschiedlich ist. Nach Ausführung der Anzeigefunktion wird die lokale Variable i wiederverwendet. Die Funktion des Abschlusses: „Auf lokale Variablen zugreifen“ und „verhindern, dass der von den Variablen belegte Speicher freigegeben wird“

//例
function fn(){
function fn(){
alert('hello');
}
return fn; //返回fn函数首地址
}
var test=fn(); //test也指向了fn函数的首地址
test();
Nach dem Login kopieren

Durch Beispiel 1 wissen wir, dass eine Variable auf die erste Adresse einer Funktion zeigen kann und eine Funktion auch die erste Adresse einer anderen Funktion zurückgeben kann.

//例
function fn(){
var i = ;
function fn(){
alert(i);
}
return fn; //返回fn函数首地址
}
var test=fn(); //test也指向了fn函数的首地址
test();
Nach dem Login kopieren

Aus Beispiel 2 wissen wir: Verwenden Sie eine Ablehnungsfunktion, um die Variable i einzuschließen, damit der Speicher der lokalen Variablen i nicht zurückgefordert wird.

//例
function fn(){
var i = ;
function fn(){
alert(i++);
}
return fn; //返回fn函数首地址
}
var test=fn(); //test也指向了fn函数的首地址
test();
test();
test();
Nach dem Login kopieren

Da in Beispiel 3 die Erinnerung an i niemals zurückgefordert wird, beträgt der Wert von i bei jedem Aufruf von fn2 +1. Das Ergebnis der Operation ist, dass 10, 11 und 12 angezeigt werden.

Abschlussprinzip: In Beispiel 3 gibt es drei Bereiche: globaler Bereich, fn1-Bereich, fn2-Bereich. Es gibt test=fn1() im globalen Bereich. Tatsächlich entspricht dieser Satz test=fn2. Es gibt var i=10 und return fn2 im Fn1-Bereich und Alert(i++) im Fn2-Bereich. Wenn test=fn1() im globalen Bereich ausgeführt wird, zeigt test auf den Bereich von fn2. Zu diesem Zeitpunkt ist i unter dem Bereich fn2 durch den globalen Bereich gebunden, i ist nicht definiert unter fn2. Also habe ich den oberen Bereich für i unter fn2 nachgeschlagen und var i=10 unter fn1 gefunden. Daher hakt der globale Test das i von fn2 und das i von fn2 das i von fn1 ein, sodass fn1 nach der Ausführung nicht wiederverwendet wird.

4. Private Attribute

Im objektorientierten Denken können einige sensible Mitglieder, die nicht öffentlich gemacht werden sollen, als privat definiert werden, und diese Funktion kann in JavaScript simuliert werden.

Syntax:

function Person(p_name){
var name = p_name;
this.age
}
Nach dem Login kopieren

var: privat

dies: öffentlich

function Person(p_name,p_age){
this.name = p_name;
var age = p_age;
}
var p = new Person('zhangsan',);
alert(p.name);
alert(p.age);
Nach dem Login kopieren

Im obigen Beispiel möchten wir var verwenden, um private Member-Eigenschaften darzustellen, aber nach der Ausführung des Person-Konstruktors wird das Alter recycelt und kann nicht als Member-Eigenschaft verwendet werden.

function Person(p_name,p_age){
this.name = p_name;
var age = p_age;
this.setAge=function(a){
age = a;
}
this.getAge=function(){
return(age);
}
}
var p = new Person('zhangsan',);
p.setAge();
alert(p.getAge());
Nach dem Login kopieren

Die beiden Methoden this.setAge und this.getAge verwenden die lokale Variable „Alter“, sodass das Alter nicht recycelt wird.

Wenn es nur eine Set-Methode gibt, bedeutet dies, dass das Attribut ein schreibgeschütztes Attribut ist.

Wenn es nur eine Get-Methode gibt, bedeutet dies, dass das Attribut ein schreibgeschütztes Attribut ist.

5. Verwendung von Anruf und Bewerbung

Die Funktionen „Aufruf“ und „Anwenden“: Rufen Sie die aktuelle Funktion mit dem angegebenen Objekt auf. Die Funktionen von „call“ und „apply“ sind genau gleich, haben jedoch eine leicht unterschiedliche Syntax.

Syntax:

call([thisObj[,arg1[,arg2[,argN]]]])

Der erste Parameter: Auf wen zeigt dies, wenn die Funktion ausgeführt wird

Parameter nach

: Geben Sie

in der Reihenfolge nach Bedarf an

apply([thisObj[,argArray]])

Der erste Parameter: Auf wen zeigt dies, wenn die Funktion ausgeführt wird

Der zweite Parameter: Array, der den Parametersatz angibt

In js haben Funktionen mehrere Aufrufformen:

Person(); //Person内的this指向window
var p=new Person(); //Person内的this指向p
per.Person(); //Person内的this指向per
function Person(p_name,p_age){
this.name = p_name;
this.age = p_age;
}
function speak(){
alert(this.name + this.age);
}
var p = new Person('zhangsan',);
//speak(); 这样调用this指向window
//p.speak(); p对象没有speak属性
Nach dem Login kopieren

Anruf verwenden und auf Anruf anwenden

function Person(p_name,p_age){
this.name = p_name;
this.age = p_age;
}
function speak(){
alert(this.name + this.age);
}
var p = new Person('zhangsan',);
speak.call(p);
speak.apply(p);
Nach dem Login kopieren

call und apply bewirken bei der Ausführung zwei Dinge: 1) Zeigen Sie innerhalb der Funktion auf den ersten Parameter 2) Rufen Sie die Funktion auf

Außerdem: Sie können das Problem auch so lösen:

P1.say=speak;

P1.say();

Diese Lösung unterscheidet sich grundlegend von der oben genannten Lösung:

Die obige Lösung besteht darin, die Speak-Funktion direkt aufzurufen, aber der Zeiger innerhalb der Funktion ändert sich.

Die folgende Lösung fügt dem p1-Objekt Attribute hinzu und das „Volumen“ des p1-Objekts wird größer.

Beispiel:

<script>
function fn(){
this.style.color='red';
}
function fn(){
this.style.fontSize='px';
}
window.onload=function(){
document.getElementById('btn').onclick=function(){
var div = document.getElementById('div');
fn.call(div);
fn.apply(div);
};
};
</script>
<div id='div'>hello javascript</div>
<input type='button' id='btn' value='确定'>
Nach dem Login kopieren

6.继承的三种实现方法

概念:在有些面向对象语言中,可以使用一个类(子类)继承另一个类(父类),子类可以拥有父类的属性和方法,这个功能可以在js中进行模拟。

三种方法:

第一种:扩展Object方法

Object.prototype.方法=function(父类对象){
for(var i in 父类对象){
this[i] = 父类对象[i];
} 
};
Nach dem Login kopieren

举例说明:

Object.prototype.ext=function(parObject){
//循环遍历父类对象所有属性
for(var i in parObject){
//为子类对象添加这个遍历到的属性
//它的值是父类对象这个属性的属性值
this[i] = parObject[i];
}
}
function Person(p_name,p_age){
this.name=p_name;
this.age=p_age;
this.speak=function(){
alert(this.name+this.age);
}
}
function Student(p_no){
this.no=p_no;
this.say=function(){
alert(this.no+this.name_this.age);
}
}
var stu = new Student();
stu.ext(new Person('xiaoqiang',));
stu.speak();
stu.say();
Nach dem Login kopieren

第二种:使用call和apply方法

语法:

父类构造器.call(this,.......);

function Person(p_name,p_age){
this.name=p_name;
this.age=p_age;
this.speak=function(){
alert(this.name+this.age);
}
}
function Student(p_no,p_name,p_age){
this.no=p_no;
this.say=function(){
alert(this.name+this.age+this.no);
}
Person.call(this,p_name,p_age);
}
var stu = new Student(,'zhagsan',);
stu.speak();
stu.say();
Nach dem Login kopieren

第三种:原型继承

语法:

子类.prototype = new 父类();

function Person(p_name,p_age){
this.name=p_name;
this.age=p_age;
this.speak=function(){
alert(this.name+this.age);
}
}
function Student(p_no){
this.no=p_no;
this.say=function(){
alert(this.name+this.age+this.no);
}
}
Student.prototype = new Person('wangwu',);
var stu = new Student();
stu.speak();
stu.say();
Nach dem Login kopieren

以上内容给大家介绍了JS面向对象(3)之Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法,希望对大家有所帮助!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Apr 04, 2025 pm 02:42 PM

Häufig gestellte Fragen und Lösungen für das Ticket-Ticket-Ticket-Ticket in Front-End im Front-End-Entwicklungsdruck ist der Ticketdruck eine häufige Voraussetzung. Viele Entwickler implementieren jedoch ...

Wer bekommt mehr Python oder JavaScript bezahlt? Wer bekommt mehr Python oder JavaScript bezahlt? Apr 04, 2025 am 12:09 AM

Es gibt kein absolutes Gehalt für Python- und JavaScript -Entwickler, je nach Fähigkeiten und Branchenbedürfnissen. 1. Python kann mehr in Datenwissenschaft und maschinellem Lernen bezahlt werden. 2. JavaScript hat eine große Nachfrage in der Entwicklung von Front-End- und Full-Stack-Entwicklung, und sein Gehalt ist auch beträchtlich. 3. Einflussfaktoren umfassen Erfahrung, geografische Standort, Unternehmensgröße und spezifische Fähigkeiten.

Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Apr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Apr 04, 2025 pm 05:09 PM

Wie fusioniere ich Array -Elemente mit derselben ID in ein Objekt in JavaScript? Bei der Verarbeitung von Daten begegnen wir häufig die Notwendigkeit, dieselbe ID zu haben ...

Der Unterschied in der Konsole.log -Ausgabeergebnis: Warum unterscheiden sich die beiden Anrufe? Der Unterschied in der Konsole.log -Ausgabeergebnis: Warum unterscheiden sich die beiden Anrufe? Apr 04, 2025 pm 05:12 PM

Eingehende Diskussion der Ursachen des Unterschieds in der Konsole.log-Ausgabe. In diesem Artikel wird die Unterschiede in den Ausgabeergebnissen der Konsolenfunktion in einem Code analysiert und die Gründe dafür erläutert. � ...

Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen?
oder:
Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen? oder: Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Apr 04, 2025 pm 05:36 PM

Diskussion über die Realisierung von Parallaxe -Scrolling- und Elementanimationseffekten in diesem Artikel wird untersuchen, wie die offizielle Website der Shiseeido -Website (https://www.shiseeido.co.jp/sb/wonderland/) ähnlich ist ...

Ist JavaScript schwer zu lernen? Ist JavaScript schwer zu lernen? Apr 03, 2025 am 12:20 AM

JavaScript zu lernen ist nicht schwierig, aber es ist schwierig. 1) Verstehen Sie grundlegende Konzepte wie Variablen, Datentypen, Funktionen usw. 2) Beherrschen Sie die asynchrone Programmierung und implementieren Sie sie durch Ereignisschleifen. 3) Verwenden Sie DOM -Operationen und versprechen Sie, asynchrone Anfragen zu bearbeiten. 4) Vermeiden Sie häufige Fehler und verwenden Sie Debugging -Techniken. 5) Die Leistung optimieren und Best Practices befolgen.

So implementieren Sie die Funktion des Ziell- und Drop-Einstellungsfunktion, ähnlich wie bei VSCODE in der Front-End-Entwicklung? So implementieren Sie die Funktion des Ziell- und Drop-Einstellungsfunktion, ähnlich wie bei VSCODE in der Front-End-Entwicklung? Apr 04, 2025 pm 02:06 PM

Erforschen Sie die Implementierung der Funktion des Bedien- und Drop-Einstellungsfunktion der Panel ähnlich wie VSCODE im Front-End. In der Front-End-Entwicklung wird VSCODE ähnlich wie VSCODE implementiert ...

See all articles