2019年4月10日 星期三

[Back To Basic] Javascript - Object ECMAScript 5

ECMAScript 5新增了很多物件方法(Object Methods)

var user = {
    name: 'Shawn',
    age: 18,
    language: 'zh-tw'
};

  • 變更屬性值
語法: Object.defineProperty(object, property, {value : value});
Object.defineProperty(user, 'language', { value: 'en' });
  • 變更中繼資料(Meta Data)
中繼資料共有五種
  1. writable: 屬性 value 是否可寫入
  2. enumerable: 屬性可否可被列舉
  3. configurable: value以外的屬性可否重新配置
  4. get: Getter
  5. set: Setter
Object.defineProperty(user, 'language', { writable: false });
user.language = '123'; // 無作用

Object.defineProperty(user, 'language', { enumerable: false });
Object.keys(user); // 不可列舉 language, 所以沒有 language

Object.defineProperty(user, 'language', { configurable: false });
Object.defineProperty(user, 'language', { get: function () { return language } }); // 無作用
  • 取得所有屬性(properties)
語法: Object.getOwnPropertyNames(object);
Object.getOwnPropertyNames(user); // 可取得所有屬性,包括 enumerable = false 的屬性
  • 列舉所有屬性(properties)
語法: Object.keys(object);
Object.keys(user);
  • 取得特定屬性的中繼資料(Meta Data)
語法: Object.getOwnPropertyNames(object);
JSON.stringify(Object.getOwnPropertyDescriptor(user, 'name')); // 取得 name 的中繼資料
  • 取得物件的prototype
語法: Object.getPrototypeOf(object);
function Person(name, age, language) {
    this.name = name;
    this.age = age;
    this.language = language;
};
var user2 = new Person('Koji', 20, 'jp');
console.log(Object.getPrototypeOf(user2)); // 用 log 才看的到
  • 禁止新增屬性到物件中
語法: Object.preventExtensions(object);
Object.preventExtensions(user2);
Object.defineProperty(user2, 'nationality', { value: 'tw' }); // 無作用
  • 取得該物件是否可新增到屬性
語法: Object.isExtensible(object);
Object.isExtensible(user2); // false
  • 密封物件,讓物件屬性不可變更
語法: Object.seal(object);
Object.seal(user2);
user2.phone = '0900123456';
document.getElementById('demo8').textContent = JSON.stringify(user2); // phone 未加入
  • 取得該物件是否被密封
語法: Object.isSealed(object);
Object.isSealed(user2);
  • 凍結整個物件(包含值)
語法: Object.freeze(object);
Object.freeze(user2);
user2.name = 'test';
user2.name; // 不會被改成test
  • 取得該物件是否被凍結
語法: Object.isFrozen(object);

沒有留言:

張貼留言