javascript - Subklasser och arv i Google App Script


Har någon några mönster för att skriva och subklassa objekt i Google Apps Script?

Jag har försökt definiera underklasser med ParentClass.call(this, args), och att lägga föräldraklassens metoder både i den ursprungliga definitionen av föräldern och genom att tilldela dem till ParentClass.prototype. Men medan denna kod klarar enhetstester, misslyckas den när den används i Google Apps Script.

Svar #1

det handlar om att utöka klass (men javascript har ingen riktig 'klass'). du kan använda Prototype.js eller mootool.js eller göra så här?

function Human () {
    this.init.apply ( this, arguments );
}
Human.prototype = {
    init: function () {
        var optns = arguments[0] || {};
        this.age = optns.age || 0;
        this.name = optns.name || "nameless";
    },
    getName : function () {
        return this.name;
    },
    getAge : function () {
        return this.age;
    }
}

function Man () {
    this.init.apply ( this, arguments );
}
Man.prototype = {
    init : function () {
        Human.prototype.init.apply (this, arguments);
        this.sex = "man";
    },
    getName : Human.prototype.getName,
    getAge : Human.prototype.getAge,
    getSex : function () {
        return this.sex;
    }
}
function Woman () {
    this.init.apply ( this, arguments );
}
Woman.prototype = {
    init : function () {
        Human.prototype.init.apply (this, arguments);
        this.sex = "woman";
    },
    getName : Human.prototype.getName,
    getAge : Human.prototype.getAge,
    getSex : Man.prototype.getSex
}

var human = new Human({age:60,name:"Tom Tomas"}),
    man1 = new Man({age:30,name:"Wood Tomas"}),
    woman1 = new Woman({age:19,name:"Mary Tomas"});

console.log( human.getName() );
console.log( man1.getName() );
console.log( woman1.getName() );

console.log( human.getAge() );
console.log( man1.getAge() );
console.log( woman1.getAge() );

console.log( human.getSex && human.getSex() );
console.log( man1.getSex() );
console.log( woman1.getSex() );

eller så kan du använda jQuerys $.extend för att göra detta. hoppas det kan hjälpa!

Svar #2

Fel: ReferenceError: <class> är inte definierad

Om din kod är korrekt och det fortfarande inte fungerar på Google Script-plattformen (får undantaget ovan), försök att sortera filen. Ja, verkligen, sortera den.

Men även efter sortering, om det ger felet 'ReferenceError: <class> is not defined', försök att ordna filen manuellt. Se till att filen med den odefinierade klassen utvärderas först genom att byta namn på filen.

001_Animal.gs < odefinierad klass
002_Rabbit.gs
003_Main.gs

Mer information om detta problem finns här.

Jag hade ett skript utan kodfel, och det fungerade inte. Jag använde också @Valentins kod, det fungerade inte heller. Allt jag behövde göra var att sortera. Efter det fungerade det.

Jag använder @Valentins kod här.