Prototypkette des JavaScript-Objektprototyps


对象的创建方法

  1. var obj = {} plainObject Objektliteral / Objekt direkt
  2. Konstrukteur
    1. Der eingebaute Konstruktor des Systems new Object()
    2. Benutzerdefinierte Funktion new FunctionName()

Benutzerdefinierte Funktionen werden mit einem großen Kamelkoffer benannt (alle Anfangsbuchstaben werden groß geschrieben).

构造函数内部原理

  1. Fügen Sie implizit this = () an der Vorderseite des Funktionskörpers hinzu
  2. Führen Sie this.xxx = xxx aus.
  3. 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'
//    }
  1. Eine erfolgreiche Änderung entspricht einer direkten Änderung der Daten im Bereich

  2. 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.toStringDer 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

Ich denke du magst

Origin blog.csdn.net/S_aitama/article/details/107393260
Empfohlen
Rangfolge