JS Object的靜態方法彙總( 上 )

要吃早餐發表於2018-07-09

前言

最近在複習js的基礎內容,特此做下總結。


以下內容參考MDN

1、Object.defintProperty()

這個方法是用來設定物件屬性的一些特性。

語法

Object.defineProperty(obj, prop, descriptor)
複製程式碼

引數

obj : 要定義或修改屬性的物件。

prop : 要定義或修改的屬性。

descriptor : 要定義或修改的特性

返回值

被設定後的物件。

關於特性

之前專門有篇文章介紹物件屬性的特性。juejin.im/post/5abce3…

示例

let obj = {
    _age: 3
};
<!-- 資料屬性 -->
Object.defineProperty(obj, 'name', {
    configurable: false,  // 能否通過 delete 刪除屬性從而重新定義屬性,能否修改屬性的特性,能否把屬性修改為訪問器屬性。
    enumerable: false, // 能否通過 for-in 迴圈返回屬性。 
    writable: true, // 能否修改屬性的值
    value: '張三' // 這個屬性的資料值。
})
<!-- 訪問器屬性 -->
Object.defineProperty(obj, 'age', {
    configurable: true,
    enumerable: true,
    get: function () {   // 讀取 age 屬性時,會執行這個函式。返回值就是 age 的值。
        return this._age;
    },
    set: function (newValue) { // 寫入 age  屬性時,會執行這個函式。
        if (newValue > 5) {
            this._age += newValue;
        } else {
            this._age = newValue;
        }
    }
})
複製程式碼

2、Object.defineProperties()

這個方法跟上面 Object.defineProperty()的作用是一樣的。只不過這個方法可以定義多個屬性。

示例

let obj = {
    _age: 2
};
Object.defineProperties(obj, {
    name: {
        configurable: false,
        writable: true,
        value: '李四'
    },
    age: {
        get: function () {
            return this._age; 
        },
        set: function (newValue) {
            if (newValue > 5) {
                this._age += newValue;
            } else {
                this._age = newValue;
            }
        }
    }
})
複製程式碼

3、Object.getOwnPropertyDescriptor()

這個方法可以獲取給定屬性的特性。

語法

Object.getOwnPropertyDescriptor(obj, prop)
複製程式碼

引數

obj : 目標所在的物件。

prop : 要獲取特性的屬性。

返回值

如果給定的屬性存在於物件上,則返回屬性描述符物件。否則返回 undefined

示例

var o, d;

o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d {
//   configurable: true,
//   enumerable: true,
//   get: /*the getter function*/,
//   set: undefined
// }

o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
//   configurable: true,
//   enumerable: true,
//   value: 42,
//   writable: true
// }

o = {};
Object.defineProperty(o, "baz", {
  value: 8675309,
  writable: false,
  enumerable: false
});
d = Object.getOwnPropertyDescriptor(o, "baz");
// d {
//   value: 8675309,
//   writable: false,
//   enumerable: false,
//   configurable: false
// }
複製程式碼

4、Object.getOwnPropertyDescriptors()

這個方法,用來獲取一個物件所有自身屬性的特性描述符。

語法

Object.getOwnPropertyDescriptors(obj)
複製程式碼

引數

obj : 要獲取的目標物件。

返回值

所指定的物件的所有自身屬性的特性描述符,如果沒有任何自身屬性則返回空物件。

示例

  • 淺拷貝一個物件
    Object.assign()方法只能拷貝源物件的可列舉的自身屬性,同時拷貝時無法拷貝屬性的特性們,而且訪問器屬性會被轉為資料屬性,也無法拷貝源物件的原型。利用Object.getOwnPropertyDescriptors()配合 Object.create()可以實現上面說的這些。
    Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
    <!-- 演示 -->
    let obj = {
        width: '200',
        height: '200',
        color: 'red',
        arr: ['one', 'two'],
        sayWidth: function () {
            console.log('我的width:', this.width);
        }
    }
    let obj1 = Object.create(obj);
    let obj2 = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
    console.log('Obj1:', obj1); 
    //'Obj1:' {}  <!-- obj物件的屬性和方法都新增到 obj1 的原型物件上了。-->
    
    console.log('Obj2:', obj2);
    //'Obj2:' {
    //    width: '200',
    //    height: '200',
    //    color: 'red',
    //    arr: ['one', 'two'],
    //    sayWidth: function () {
    //        console.log('我的width:', this.width);
    //    }
    // }
    複製程式碼

5、Object.getPrototypeOf()

這個方法返回給定物件的原型物件。

語法

Object.getPrototypeOf(obj)
複製程式碼

引數

obj : 要獲取原型的物件。

返回值

給定物件的原型。如果沒有繼承屬性,返回 null

示例

function Person (name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function () {
    console.log(this.name);
}
let zhangsan = new Person('張三', 20);
console.log(Object.getPrototypeOf(zhangsan));
// {
//    sayName: f ()    
// }
複製程式碼

6、Object.getOwnPropertyNames()

這個方法返回給定物件的所有自身屬性的屬性名(包括不可列舉屬性,但不包括Symbol值作為名稱的屬性) 組成的陣列。

語法

Object.getOwnPropertyNames(obj)
複製程式碼

引數

obj : 目標物件。

返回值

在給定物件上找到的自身屬性對應的字串陣列。

示例

  • 只獲取可列舉的屬性
    下面的例子使用 Array.prototype.filter()方法,從所有的屬性名陣列中去除不可列舉的屬性。剩餘的就是可列舉的屬性
function getEnumable(target) {
    let keyNames = Object.getOwmPropertyNames(target);
    let keyAllNames = Object.keys(target);
    let tempArr = [];
    tempArr = keyNames.filter(item, index) {
        if (keyAllNames.indexOf(item) > -1) {
            return true;
        } else {
            return false;
        }
    }
    return tempArr;
}
複製程式碼

今天先總結到這。明天繼續。

相關文章