object.defineproperty 的用法

Mythsool發表於2018-07-16

本人語言組織能力有限,且暫為記錄一下,故簡單潦草寫下

object.defineproperty據說很牛,連observer的草案也被髮起人回收,vuejs的雙向繫結也是通過這個方法實現的

他有三個引數

1、被修改的物件

2、新增或者修改的物件屬性

3、描述

描述分為兩種:1:資料描述 2:存取描述

1:資料描述即為簡單提供value

value:屬性的值

writable:如果為false,屬性的值就不能被重寫,只能為只讀了

var a = {}; 
 
Object.defineProperty(a, "b", { 
    value : 123,
    writable : false});
 
a.b=223;
a.b   //列印123

enumerable:是否能在for...in迴圈中遍歷出來或在Object.keys中列舉出來

var a = {}; 
 
Object.defineProperty(a, "b", { 
    value : 123,
    enumerable : false});
 
Object.keys(a)  //列印[]
var a = {}; 
 
Object.defineProperty(a, "b", { 
    value : 123,
    enumerable : true});
 
Object.keys(a) // 列印["b"]

當設定的configurable 為false 則不能在設定其他value,configurable,writable屬性

2存取描述 即為get set 並且 get set不能與value同時使用

使用get set 預設調取該屬性的get方法 

set方法是設定值的時候呼叫。。。

也就是說

當使用get set方法的時候就不能使用value 等屬性

var  a={};
Object.defineProperty(a,'b',{
	get:function (v){
		
		console.log("獲取的值為")
		return 1;
	},
	set:function(v){
		console.log("設定的值為"+v)
	}
})
a.b=2;//設定的值為2
a.b // 獲取的值為 /b  列印1

 

相關文章