首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript Getter 語法解析:get players() 屬性訪問器與唯讀對象返回模式

     編輯:程式設計綜合問答

代碼結構還原

function Fun() {}
Fun.prototype = {
    _players: null,
    _rules: null,
    _done: null,
    iURL: 'https://example.com/',
    iURL_on: 'https://example.com/',

    get players() {           // ← Getter (屬性訪問器)
        if (!this._players) {
            this._players = { // 惰性初始化
                'biubiu_loader': this.iURL + 'loader.swf',
                'biubiu_player': this.iURL + 'player.swf'
            };
        }
        return this._players; // 返回對象引用
    },

    get rules() {             // 另一個 Getter
        if (!this._rules) {
            this._rules = { ... };
        }
        return this._rules;
    }
};

核心概念:get / set 訪問器屬性

特性說明
語法 get propName() { ... } / set propName(val) { ... }
調用方式 obj.propName (像訪問屬性,非函數調用 obj.propName())
執行時機 每次讀取屬性時執行 getter 函數體
返回值 getter 的 return 值即為屬性值
this 指向 調用對象 (此處為 Fun 實例)
可配置性 默認 configurable: true, enumerable: true

該模式的設計意圖

  1. 惰性初始化:首次訪問時才構建對象,節省啟動資源。
  2. 唯讀保護:外部無法直接賦值 obj.players = ... (除非定義 set),防止誤覆蓋內部狀態。
  3. 計算屬性:返回值可動態計算 (如根據 this.iURL 拼接)。
  4. 緩存:_players 緩存構建結果,後續訪問直接返回。

對比:C# / Java 屬性語法

// C#
public Dictionary<string, string> Players {
    get {
        if (_players == null) _players = BuildPlayers();
        return _players;
    }
}

// Java (無語法糖,慣用 getXxx())
public Map<String, String> getPlayers() {
    if (players == null) players = buildPlayers();
    return players;
}

實際應用場景:去廣告腳本 (UserScript)

代碼來源於 YoukuAntiADs / CleanPlayer 類去廣告腳本。
get players() 返回播放器 SWF 地址映射,get rules() 返回過濾規則。
腳本注入頁面後,攔截視頻播放器請求,替換為無廣告播放器地址。

注意事項

  • Getter 中避免副作用 (如網絡請求、修改全局狀態),否則屬性讀取行為不可預測。
  • 若需深度唯讀,返回 Object.freeze(clone) 或使用 Proxy 代理。
  • ES6 Class 寫法更清晰:
    class PlayerConfig {
        #players = null;
        get players() {
            if (!this.#players) this.#players = this.buildPlayers();
            return this.#players;
        }
    }
    
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved