2017年8月28日 星期一

[JavaScript] Object, Proerty, Encapsulation

  • JavaScript 建立物件的方法
    • 使用 new 運算式
      • new 運算式,跟隨著建構函式  
var userInfo1 = new Object();
userInfo1.Name = 'Lyndon';
userInfo1.Age = 30;
    • 使用 Object Literal Notation 語法
      • CASE 1:
        1. 大括號「{」開始,接著是屬性名稱
        2. 冒號「:」,之後是屬性值
        3. 兩屬性之間使用「,」做區隔

var UserInfo2 = {
    'Name': 'Lyndon',
    'Age': 30
}
      • CASE 2
        1. 令外可利用 Object Literal Notation 語法建立包含預設屬性的物件,使用句點「‧」為物件新增屬性
var UserInfo2 = {}
UserInfo2.Name = 'Lyndon';
UserInfo2.Age = 30;
    • Result:如上列呈現結果
      1. 因此可使用「‧」存取屬性
      2. 令外可使用「[]」存取屬性
        • 屬性名稱不是簡單的識別項
        • 屬性名稱在直行階段才能得知 (因此不推建此使用方法)
  • JavaScript Reference Type (參考型別)
    • Mothed (方法)
      • Mothed (方法)就是 function (函式)

var UserInfo = {
    Name: 'Lyndon',
    Age: 30,
    getAge: function(){
        return this.Age;
    }
}
    • Property:Data Property (資料屬性)
      • 四個 attribute 
var UserInfo = {}
Object.defineProperties(UserInfo, {
    'Name':{
        // 1. 是否可使用 delete 語法刪除
        // 2. 變更屬性 attribute 
        // 3. 將資料屬性變更為 Accessor Property (存取子屬性)
        configurable: false,
        // 指明屬性是否可以搭配 for .. in 語法使用
        enumerable: false,
        // 屬性值是否可以變更
        writable: false,
        // 屬性值
        value: 'Lyndon'
    },
    'Age':{
        configurable: true,
        enumerable: true,
        writable: true,
        value: 30
    }        
});
    • Property:Accessor Property(存取子屬性) 
      • 需先理解 Data Property 與 Encapsulation,下方詳細描述
  • Encapsulation (封裝)
    • 使用 closures 來達到封裝
    • 原則
      • 建構函式宣告變數時,不要使用 this 關鍵字
      • 使用 this 來宣告方法,以讀/寫屬性值
var UserInfo = function(Name, Age){
    // 區域變數
    var _Name = '';
    var _Age = 0;
    // 方法
    this.getName = function(){
        return _Name;
    }
    this.setName = function(Name){
        _Name = Name;
    }
    this.getAge = function(){
        return _Age;
    }
    this.setAge = function(Age){
        if(0 < Age && Age < 100 )
            _Age = Age;
    }
    // 使用方法
    this.setName(Name);
    this.setAge(Age);
}

var UserInfo1 = new UserInfo('Lyndon', 30);
  • Property:Accessor Property(存取子屬性) 
    • 存取物件的資料屬性值,達到 Encapsulation (封裝),定義存取屬性時包含
      • get:function (函式),讀取資料屬性
      • set:function (函式),修改資料屬性

var UserInfo = function(Name, Age) {
    // 區域變數
    var _Name = '';
    var _Age = 0;
    // Object.defineProperties 定義資料屬性
    Object.defineProperties(this, {
        'Name': {
            get: function() {
                return this._Name;
            },
            set: function(Name) {
                this._Name = Name;
            }
        },
        'Age': {
            get: function() {
                return this._Age;
            },
            set: function(Age) {
                if (0 < Age && Age < 100)
                    this._Age = Age;
            }
        }
    });
    // 使用 Accessor Property
    this.Name = Name;
    this.Age = Age;
};

var UserInfo1 = new UserInfo('Lyndon', 30);
  • REF
    • 恆逸 - U2750c

    沒有留言:

    張貼留言