Heim > Web-Frontend > js-Tutorial > Wie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und Eigenschaftsänderungen um?

Wie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und Eigenschaftsänderungen um?

DDD
Freigeben: 2024-12-05 18:24:13
Original
577 Leute haben es durchsucht

How Does Crockford's Prototypal Inheritance Handle Nested Objects and Property Modification?

Crockfords prototypische Vererbung: Probleme mit verschachtelten Objekten

Douglas Crockfords prototypisches Vererbungsmuster, beschrieben in seinem Buch „Javascript: The Good Parts“, vereinfacht die Objektvererbung und vermeidet die Verwirrung, die mit dem Schlüsselwort „new“ verbunden ist. Beim Versuch, mithilfe dieses Musters von verschachtelten Objekten zu erben, tritt jedoch ein Problem auf: Das Überschreiben einer verschachtelten Objekteigenschaft wirkt sich auf die gesamte Prototypenkette aus.

Beachten Sie den folgenden Code:

var flatObj = {
    firstname: "John",
    lastname: "Doe",
    age: 23
}
var person1 = Object.create(flatObj);

var nestObj = {
    sex: "female",
    info: {
        firstname: "Jane",
        lastname: "Dough",
        age: 32  
    }
}
var person2 = Object.create(nestObj);

var nestObj2 = {
    sex: "male",
    info: {
        firstname: "Arnold",
        lastname: "Schwarzenneger",
        age: 61  
    }
}
var person3 = {
    sex: "male"
}
person3.info = Object.create(nestObj2.info);

// now change the objects:
person1.age = 69;
person2.info.age = 96;
person3.info.age = 0;

// prototypes should not have changed:
flatObj.age // 23
nestObj.info.age // 96 ???
nestObj2.info.age // 61

// now delete properties:
delete person1.age;
delete person2.info.age;
delete person3.info.age;

// prototypes should not have changed:
flatObj.age // 23
nestObj.info.age // undefined ???
nestObj2.info.age // 61
Nach dem Login kopieren

In this Beispielsweise wirkt sich die Änderung einer Eigenschaft des verschachtelten Objekts in person2 nach dem Erben vom verschachtelten Objekt „nestObj“ auf den Prototyp „nestObj“ aus, und das Gleiche gilt auch für „person3“. verschachteltes Objekt. Dies ist ein unerwartetes Verhalten und untergräbt den beabsichtigten Zweck des Musters, Änderungen an einzelnen Objekten zu isolieren.

Der Grund für diese Inkonsistenz liegt in der grundlegenden Natur der Vererbung in JavaScript-Objekten. Wenn ein Objekt von einem anderen erbt, erstellt es einen Verweis auf die Eigenschaften dieses Objekts, anstatt unabhängige Kopien zu erstellen. Das bedeutet, dass sich alle an den geerbten Eigenschaften vorgenommenen Änderungen sowohl im untergeordneten Objekt als auch im Prototyp widerspiegeln.

Um dieses Problem zu vermeiden, muss man explizit ein neues Objekt für verschachtelte Eigenschaften erstellen, bevor man sie erbt. Dadurch wird sichergestellt, dass Änderungen an den verschachtelten Eigenschaften auf das untergeordnete Objekt beschränkt sind. Daher sollte der korrekte Code lauten:

person3.info = Object.create(nestObj2.info); // Create a new object for the nested property
person3.info.age = 0; // Change the age property without affecting the prototype
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie geht Crockfords prototypische Vererbung mit verschachtelten Objekten und Eigenschaftsänderungen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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