Object的幾個方法(defineProperty,hasOwnProperty...)

1、defineProperty

let obj = {
    name:"諸葛鋼鐵",
    age:"18"
}
Object.defineProperty(obj,"idno",{
    value:"15089",//簡單點就是 設置屬性的值
    writable:false,//是否可操作屬性值,默認值false
    configurable:false,//是否可修改配置configurable如果值為false descriptor內(nèi)的屬性都不可操作),默認值false
    enumerable:false//是否可枚舉,默認值false。Object.keys()獲取的是可枚舉的,Objec.getOwnPropertyNames()獲取的是所有的值。
})

使用Object.defineProperty() 定義對象屬性時,如已設置 set 或 get, 就不能設置 writable 和 value 中的任何一個了,不然會報錯。

  • writable
let obj = {
    name:"諸葛鋼鐵",
    age:"18"
}
Object.defineProperty(obj,"idno",{
     value:"15089",
     writable:false,//不能修改
     configurable:false,
     enumerable:false
})
try{
    obj.idno = "111"
}catch{ }
console.log(obj) //{name:"諸葛鋼鐵",age:"18",idno:"15089"}
  • configurable
let obj = {
    name:"諸葛鋼鐵",
    age:"18"
}
Object.defineProperty(obj,"idno",{
     value:"15089",
     writable:false,
     configurable:false,//控制descriptor內(nèi)屬性都不可改變
     enumerable:false
})
try{
    Object.defineProperty(obj,"idno",{
        writable:true
    })
}catch{ }
console.log(Object.getOwnPropertyDescriptor(obj,'idno'))
//{configurable: false,enumerable: false,value: "15089",writable: false}
  • enumerable
let obj = {
    name:"諸葛鋼鐵",
    age:"18"
}
Object.defineProperty(obj,"idno",{
     value:"15089",
     writable:false,
     configurable:false,//控制descriptor內(nèi)屬性都不可改變
     enumerable:false//是否可枚舉
})

console.log(Object.keys(obj))
//{name:"諸葛鋼鐵",age:"18"}

其實defineProperty和set,get就是vue3.0前雙向綁定原理的實現(xiàn)

//html
<input type="text">
//js
let obj = {}
/**
*obj      要劫持的對象
*name     要劫持對象的屬性
*callback 劫持以后的操作
*/
function watch(obj, name, callback) {
    let value = obj.name
    Object.defineProperty(obj, name, {
        set(msg) {
            // 觸發(fā)setter給obj賦值
            value = msg
            //執(zhí)行劫持后的操作
            callback(value)
        },
        get() {
            //返回獲取屬性值
            return value
        }
    })
}
function doSomething(value) {
    document.querySelector('div').innerHTML = value
    document.querySelector('input').value = value
}
//監(jiān)聽input變化 
document.querySelector('input').addEventListener('input', (e) => {
    obj['msg'] = e.target.value
})
watch(obj, 'msg', doSomething)

2、hasOwnProperty

Object的hasOwnProperty()方法返回一個布爾值,判斷對象是否包含特定的自身(非繼承)屬性。

var obj = {
    aa:"111"
}
console.log(obj.hasOwnProperty("aa"))//true
console.log(obj.hasOwnProperty("toString"))//false

3、defineProperties

同defineProperty

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
});

4、getPrototypeOf和isPrototypeOf

getPrototypeOf此方法可以獲取指定對象的原型對象
isPrototypeOf方法用于測試一個對象是否存在于另一個對象的原型鏈上。

function Person(){
  this.name="123";
  this.nofg="11";
}
Person.prototype={
  age:3,
  address:"sdag"
}
let person=new Person();
console.log(Object.getPrototypeOf(person).age);//3
console.log(Person.prototype.isPrototypeOf(person));//true

5、getOwnPropertyNames

列出一個由指定對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)組成的數(shù)組。
區(qū)別于Object.keys()。

var aa = {
    name:"123",
    age:17
}
Object.defineProperty(aa,"idno",{
    value:"1234"http://不可枚舉的
})
console.log(Object.getOwnPropertyNames(aa))//["name", "age", "idno"]

6、getOwnPropertyDescriptor和getOwnPropertyDescriptors

getOwnPropertyDescriptors方法用來獲取一個對象的所有自身屬性的描述符。
getOwnPropertyDescriptor方法用來獲取一個對象的指定屬性的描述符。

var aa = {
    name:"123",
    nofg:11
}
console.log(Object.getOwnPropertyDescriptor(aa,"name"));
console.log(Object.getOwnPropertyDescriptors(aa));
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容