Heim  >  Artikel  >  Web-Frontend  >  js Holy Grail Pattern-Erklärung

js Holy Grail Pattern-Erklärung

小云云
小云云Original
2018-03-27 17:04:263234Durchsuche

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,...).

Normale Vererbung zum Teilen von Variablen

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();// 显然我们对已存在的原型对象修改,对别人使用的的或者说以前构建的对象产生了影响

Das Muster des Heiligen Grals löst Probleme

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();

Fazit

  1. 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

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

  3. 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!

Stellungnahme:
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