Heim > Artikel > Web-Frontend > js Holy Grail Pattern-Erklärung
Das Holy Grail-Muster dient dazu, die Mitglieder (hauptsächlich öffentliche Methoden) im vorhandenen Prototypobjekt (A.prototype) zu erben und gleichzeitig das Prototypobjekt (A.prototype) entsprechend Ihren eigenen Anforderungen zu ändern, um es anzupassen Struktur, die unseren Anforderungen entspricht. Diese Änderung hat keine Auswirkungen auf vorhandene Instanzen (a1, a2,...).
var Person = function () {}; Person.prototype.sayHello = function () { console.log('hello'); };// 假设 person 原型属性上有很多方法和变量我们需要拿来使用,比如: spell这个方法我们要拿来继续使用Person.prototype.spell = function () { console.log('i can spell!'); };var personA = new Person();var personB = new Person();var personC = new Person();var personD = new Person();var personE = new Person();var personF = new Person();var personG = new Person();var personH = new Person(); personA.sayHello(); personA.spell(); personB.sayHello(); personB.spell();// ...// 之前应项目需求 实例化了很多对象, 现在需要 实例化 n 个说中文的对象,同时要具备之前的 spell相同能力 Person.prototype.sayHello = function () { console.log('你好'); };var chinaPersonA = new Person();var chinaPersonB = new Person();var chinaPersonC = new Person();var chinaPersonD = new Person();var chinaPersonE = new Person(); chinaPersonA.sayHello(); chinaPersonA.spell(); chinaPersonB.sayHello(); chinaPersonB.spell();// ...// 之前的对象还能说英文 hello 吗? 显然不能了personA.sayHello(); // 你好personA.spell(); personB.sayHello(); // 你好personB.spell();// 显然我们对已存在的原型对象修改,对别人使用的的或者说以前构建的对象产生了影响
var Person = function () {} Person.prototype.sayHello = function () { console.log('hello'); }; Person.prototype.spell = function () { console.log('i can spell!'); };var personA = new Person();var personB = new Person(); personA.sayHello(); personA.spell();var grailMode = (function () { return function (Origin, Target) { var Temp = function () {};// 临时构造函数 Temp.prototype = Origin.prototype; Target.prototype = new Temp(); // 这里不是明白,为什么要加个临时构造函数 Target.prototype.constructor = Target; // 目标构造函数原型属性constructor指向 目标构造函数 Target.prototype.ancestor = Origin; // target 的生父 } })();// 我们定制的构造函数var ChinaPerson = function () {} grailMode(Person, ChinaPerson); ChinaPerson.prototype.sayHello = function () { console.log('你好'); }var ChinaPersonA = new ChinaPerson(); ChinaPersonA.sayHello(); ChinaPersonA.spell(); personA.sayHello(); personA.spell();
Der Heilige Das Gral-Muster wird dadurch erreicht, dass der vorhandene Konstruktor (Factory) ein Instanzobjekt (P) erstellt und dann einen Konstruktor (C) so anpassen, dass das Prototypattribut dieses Konstruktors (C) auf das Instanzobjekt (P) (die Instanz) zeigt Objekt des temporären Konstruktors). Wenn wir also das Attributmitglied des Prototypattributs des benutzerdefinierten Konstruktors (C) ändern, ändert sich tatsächlich nur das Attributmitglied
Prototyp Kettenzugriff im Instanzobjekt (P) Das Prinzip lautet: Überprüfen Sie zunächst, ob das Mitglied im aktuellen Objekt vorhanden ist. Wenn es vorhanden ist, greifen Sie direkt darauf zu. Wenn es nicht vorhanden ist, greifen Sie auf sein Prototypobjekt zu ... Wenn die Prototypenkette nicht durchlaufen wird, wird undefiniert zurückgegeben.
Instanzen können auf die Attributmitglieder im Prototypobjekt zugreifen, aber sie können die Mitglieder im Prototypobjekt nicht 实例.成员 = value
ändern. Instance.member entspricht dem Hinzufügen eines Attributmitglieds zum aktuellen Instanz und Zuweisung.
Das obige ist der detaillierte Inhalt vonjs Holy Grail Pattern-Erklärung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!