1.2.8.4.屬性與可鏈結方法

  • 利用閉包, 可以建立一個供IIFE內部使用但不會被其他開發者取用而影響到原始碼本身

  • 原型物件中的this會指向物件本身

(function (global, $) {
    //不需要每次都使用new
    var Greetr = function (firstname, lastname, language) {
        return new Greetr.init(firstname, lastname, language)
    }

    var supportedLangs = ['en', 'es'];

    var greetings = {
        en: 'Hello',
        es: 'Hola'
    };

    var formalGreetings = {
        en: 'Greetings',
        es: 'Saludos'
    };

    var logMessage = {
        en: 'Logged in',
        es: 'dfdsfdsf'
    };

    //* 原型物件中的this會指向物件本身
    Greetr.prototype = {
        fullName: function(){
            return this.firstname + ' ' + this.lastname;
        },
        validate: function(){
           if (supportedLangs.indexof(this.language) === -1) {
               throw "Invalid language";
           }
        },
        greeting: function() {
            return greetings[this.language] + this.fistname + '!';
        },
        formalGreeting: function() {
            return formalGreetings[this.language] + this.fistname + '!';
        },
        //可鍊結的方法
        greet: function(formal) {
            var msg;
            if (formal) {
                msg = this.formalGreeting();
            } else {
                msg = this.greeting();
            }

            if (console) {
                console.log(msg);
            }
            return this
        },
        log: function() {
            if (console) {
                console.log(logMessage[this.language]);
            }
            return this;
        },
        setLang: function(lang) {
            this.language = lang;
            this.validate();
        }
    };
    //用new建構子呼叫時, this會指向新建立的空物件
    Greetr.init = function (firstname, lastname, language) {
    var self = this;
        self.firstname = firstname || '';
        self.lartname = lastname || '';
        self.language = language || 'en';
    }
    //由Greetr.init所建立的物件應該指向Greetr.prototype作為原型鍊
    Greetr.init.prototype = Greetr.prototype;
    //IIFE外面的Greetr(別名G$)會指向Greetr
    global.Greetr = global.G$ = Greetr;

}(window, jQuery));
  • 使用

var g = G$('John', 'Doe');
g.greet().greet(true);

Last updated