Artikelverzeichnis
对象的创建方法
var obj = {}
plainObject Objektliteral / Objekt direkt- Konstrukteur
- Der eingebaute Konstruktor des Systems
new Object()
- Benutzerdefinierte Funktion
new FunctionName()
- Der eingebaute Konstruktor des Systems
Benutzerdefinierte Funktionen werden mit einem großen Kamelkoffer benannt (alle Anfangsbuchstaben werden groß geschrieben).
构造函数内部原理
- Fügen Sie implizit this = () an der Vorderseite des Funktionskörpers hinzu
- Führen Sie this.xxx = xxx aus.
- Implizite Rückgabe
Kann auch Parameter übergeben
function Car(number){
// this = {};
this.date = 2020;
this.number = number;
//return this;
}
new car1 = new Car(1);
包装类
- neue Nummer()
- neuer String ()
- neuer Boolescher Wert ()
Der ursprüngliche Typ hat keine Attribute und Methoden
und wird beim Aufruf automatisch zu einer Wrapper-Klasse
//包装类
var a = 1;
a.abc = 2;
// 不忍心报错 自动执行
// new Number(1).len = 2; delete 执行完又删除了
console.log(a.len); // undefined
// 发现访问属性又自动创建 new Number(4).len 是空的
Die Zeichenfolge hat die Eigenschaft .length und der
Vorgang ist der gleiche wie oben
var str = 'abcd';
str.length = 2;
// nwe String('abcd').length = 2; delete
console.log(str); // 4
// new String('abcd').length 本身这个属性是存在的
ps. Du Yi "Objekt, Verpackung (Teil 2)" Übungen in der zweiten Hälfte
原型
.prototype - Prototype ist ein Vorfahr
Person.prototype.name= 'hello';
function Person{
}
var a = new Person();
console.log(a.name); // 输出 hello 继承自原型
Der Prototyp ist auch ein Objekt, das so geschrieben werden kann
Person.prototype = {
name : 'hello'
}
...
方别写很多
Es gibt jedoch einen kleinen Unterschied, der später erwähnt wird
定义
Der Prototyp ist ein Attribut des Funktionsobjekts, das den gemeinsamen Vorfahren
des vom Konstruktor erzeugten Objekts definiert . Das vom Konstruktor erzeugte Objekt kann die Eigenschaften und Methoden des
Prototyps erben . Der Prototyp ist auch ein Objekt.
功能
Reduzieren Sie die Codeduplizierung und
fügen Sie gemeinsame Teile in den Prototyp ein
修改原型
Durch Hinzufügen, Löschen, Ändern und Überprüfen
können nur Prototypvorgänge direkt ausgeführt werden
Kann nicht von untergeordneten Elementen betrieben werden
function Father(){
this.num = 1;
}
var father = new Father();
Son.prototype = father;
function Son(){
}
var son = new Son();
son.num = 2;
//son.num ++; 同
console.log(father.num); // 1
Dies entspricht dem Hinzufügen eines neuen num-Attributs zum Sohn. Das Attribut im
Vater wurde nicht geändert oder geändert (Fehler),
dies kann jedoch durchgeführt werden
function Father(){
this.num = 1;
this.say = {
name : 'niko'
}
}
var father = new Father();
Son.prototype = father;
function Son(){
}
var son = new Son();
son.say.name = 'dio'; // 二次调用 .name
console.log(son.say.name); // dio
Eine erfolgreiche Änderung kann nur die Attribute in der Methode ändern, was einem zweiten Aufruf entspricht
constructor
Der Prototyp des Systems verfügt über ein Konstruktorattribut und
gibt einen Konstruktor zurück,
kann jedoch manuell geändert werden
_proto_
_proto_
Zeigen Sie auf den Prototyp,
verbinden Sie den Prototyp und das
Unterobjekt und suchen Sie das Attribut in _proto_, nachdem Sie das Attribut gefunden haben
_proto_
Der Prototyp wird standardmäßig gespeichert
, kann jedoch geändert werden
Der Unterschied zwischen den beiden Schriften
Machen Sie einen Unterschied in der zweiten Änderung
Person.prototype.name = 'hello';
function Person(){
// 系统自动执行 var this = {_proto_ : Person.prototype}
}
var person = new Person();
//两种修改方式
// 1. Person.prototype.name = 'wow';
// 2. Person.prototype = {
// name : 'wow'
// }
-
Eine erfolgreiche Änderung entspricht einer direkten Änderung der Daten im Bereich
-
Person.prototype.name ist immer noch
die Welle des Hallo. Diese Welle dient dazu, einen neuen Raum zu erstellen. Beachten Sie, dass sich der Kommentar im Konstruktor zum
leichteren Verständnis auf die Richtung von _proto_ bezieht :
var obj = {
name : 'a'};
var obj1 = obj ;
obj = {
name : 'b'}; // obj1 指向的还是a
Person.prototype = {
name : 'a'};
_proto_ = Person.prototype;
Person.prototype = {
name : 'b'};
Platz geändert
1 Ändern Sie die Eigenschaft im Raum
2 Ändern Sie den Raum direkt
Beachten Sie die Bestellung gerade jetzt! !
Person.prototype.name = 'hello';
function Person(){
// 系统自动执行 var this = {_proto_ : Person.prototype}
}
Person.prototype = {
name : 'wow'
}
var person = new Person();
Jetzt erfolgreich neu in der Rückseite ändern
Prototypkette
Ich muss nicht mehr über die Zusammensetzung der Prototypenkette sagen.
Hinzufügen, löschen, ändern
Gleich wie oben Prototyp
dieses kleine Wissen
Son.prototype = {
name : 'niko',
sayName : function (){
console.log(this.name);
}
}
function Son () {
this.name = 'dio';
}
var son = new Son(); // dio
Dies weist darauf hin, dass die Person, die die Methode hier aufgerufen hat, der Sohnruf ist
Object.create (Prototyp)
Bequemere Konstruktion
var obj = {
name : 'sunny' , age : 123};
var obj1 = Object.create(obj); // obj1 原型就是obj 可以使用name和age
等同于
Obj.prototype.name = 'sunny';
function Obj() {
}
var obj1 = new Obj();
//var obj1 = Object.creat(Obj.prototype); 和上面相等 构造函数是空的就一样
Das Terminal der meisten Objekte ist Object.prototype
Das Prototyp-Ketten-Terminal Object.prototype
verfügt über Methoden wie toString (die Wrapper-Klasse verfügt auch über einen eigenen toString).
Beachten Sie, dass es in den meisten Fällen Sonderfälle gibt. Der
Prototyp kann null sein, wenn er mit Object.creat () erstellt wird.
var obj = Object.creat(null);
Es gibt keine Eigenschaft in der Methode Object.prototype,
die auf null gesetzt ist, nachdem Personen hinzugefügt wurden, _proto_
die nicht verwendet werden können
(Zweifel an der Schlafenszeit) _proto_
und .prototype
toString umschreiben
123.toString
Der Fehlerpunkt wird als Gleitkommazahl erkannt und der Variablen zugewiesen
. Der toString von 123 wird mit Hilfe eines Zwischenbetrags aufgerufen . Es handelt sich um die eigene Methode von Number anstelle von Object.
var num = 123;
num.toString(); --> // new Number(num).toString();
Number.prototype.toString = function(){
} --> 有自己的toString
Number.prototype._proto_=Object.prototype
Diese Situation heißt 方法重写
: Die gleichnamige Methode implementiert verschiedene Funktionen. Z
wird am vorderen Ende der Prototypenkette behandelt
ToSting (); Methode wird aufgerufen, wenn document.write (xx); aufgerufen wird
Off-Topic-Genauigkeit
Der Bereich, den js normalerweise berechnen kann, beträgt 16 Stellen vor dem Dezimalpunkt und 16 Stellen nach dem Dezimalpunkt
anrufen / bewerben
Funktion Ändern dieses Punkts Der
Zweck besteht darin , dies in der Ausführungsfunktion in das übergebene Objekt zu ändern . Der
Unterschied besteht darin, dass die Parameterliste unterschiedlich ist.
var name = "1";
var obj = {
name:2,
prop: {
name:3,
getName: function() {
return this.name;
}
}
}
console.log(obj.prop.getName()); //3
console.log(obj.prop.getName.call(obj)); //2
console.log(obj.prop.getName.call(this)); //1 在全局的this 是window
Wenn Sie 3 direkt obj.prop.getName () erhalten möchten, ist das aktuelle Objekt dieser Methode prop
Wenn wir 2 erhalten möchten, können wir obj.prop.getName.call (obj) das Objekt obj an die Methode übergeben. Dieses Mal ist dieses Objekt obj, this.name entspricht obj.name
1 ist dasselbe wie obj.prop.getName.call (this), wobei dies die aktuelle Seite ist und das Fenster dasselbe ist
Natürlich können Sie auch apply verwenden. Der Unterschied zwischen apply und call ist call, dh die call-Methode akzeptiert eine Liste mehrerer Parameter, während die apply-Methode ein Array akzeptiert, das mehrere Parameter enthält. apply (thisargs, []) verwendet ein Array, um Parameter an die Methode call (this, param1, param2) zu übergeben. Ein kleines Beispiel unten
function callTest(name, price) {
console.info(name + "-" + price);
}
callTest.call(this, 'superbing', 100);
callTest.apply(this, ['superbing', 200]);
Praktisches Beispiel
借用别人的函数实现自己的功能
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex; // Person的this
}
function Student(name,age,sex,tel,grade){
// var this ={} 等待赋值
Person.call(this,name,age,sex);
this.tel = tel;
this.grade = grade;
}
var student = new Student('sunny',123,'male',139,2017);
Übergeben Sie das Student-Objekt an Person, sodass sich dieses in Person tatsächlich auf die Variable in Student bezieht, was
dem Übertragen der drei Sätze von Person an Student entspricht. Es wird
abgekürzt, wenn die Struktur anderer vollständig mit Ihnen übereinstimmt.
Prototyp und Proto
Das ist gut