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

JavaScript 對象字面量屬性引用:無法直接引用同對象其他屬性的語言機制與解決方案

     編輯:程式設計綜合問答

問題代碼

var A = {
    options: {
        attr1: 100,
        attr2: 300,
        attr3: attr1 * attr2  // ReferenceError: attr1 is not defined
    }
};

根本原因

對象字面量定義階段不創建作用域:
attr1、attr2 是屬性鍵值,而非變量,無法在同一字面量內直接引用。

解決方案

方案一:方法延遲計算(推薦)

var A = {
    options: {
        attr1: 100,
        attr2: 300,
        getAttr3: function() { return this.attr1 * this.attr2; }
    }
};
console.log(A.options.getAttr3()); // 30000

方案二:分步定義

var A = { options: {} };
A.options.attr1 = 100;
A.options.attr2 = 300;
A.options.attr3 = A.options.attr1 * A.options.attr2;

方案三:工廠函數/構造函數

function createOptions(a1, a2) {
    return {
        attr1: a1,
        attr2: a2,
        get attr3() { return this.attr1 * this.attr2; } // ES5 getter
    };
}
var A = { options: createOptions(100, 300) };

ES6 類寫法(現代標準)

class Options {
    constructor(attr1, attr2) {
        this.attr1 = attr1;
        this.attr2 = attr2;
    }
    get attr3() { return this.attr1 * this.attr2; }
}
const A = { options: new Options(100, 300) };

對象字面量是「靜態數據結構」,動態計算屬於「行為」,應通過方法/getter 封裝。這也是「數據與行為封裝」面向對象原則的體現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved