看不懂源碼?先來惡補一波Object原型吧

Object

Object是一種引用數據類型,也是一個構造函數。數組

Object屬性

一、Object.prototype

Object的原型。 Object原型處於原型鏈的頂端,是全部對象的原型。app

二、Object.name

返回Object函數名。函數

Object方法

一、Object.assign()

將兩個對象合併,並返回新的對象。 在產生衝突時,後者的屬性會覆蓋前者。 該方法屬於淺拷貝。ui

var target={name: "failte", age: 18};

var source={sex: "man", age: 22};

var obj = Object.assign(target, source);
複製代碼

二、Object.create()

以對象原型,建立一個新對象。 第一個參數爲原型對象,第二個參數爲新描述符屬性對象。this

var obj = {
    this.a="a";
    this.b="b"
};

var nobj = Object.create(obj, {
    name: {
        value: 42,
        writable: true,
        enumerable: true,
        configurable: true
    }
});
複製代碼

三、Object.seal()

封裝對象。封裝後的對象沒法增刪屬性,但能夠修改屬性。 能夠經過Object.isSealed()方法判斷對象是否被封裝。spa

var obj = {a: 1};

Object.seal(obj);

obj.b = 'el';

delete obj.a;

console.log(obj);
複製代碼

四、Object.freeze()

凍結對象。被凍結的對象增刪改屬性。 返回和傳入的參數是同一對象。 能夠使用Object.isFrozen()方法判斷對象是否被凍結。prototype

var obj = {a: 1};

Object.freeze(obj);

obj.b = 2;

delete obj.a;

obj.a = 10;

console.log(obj);
複製代碼

五、Object.is()

判斷兩個對象是否相同。 比較兩方爲 undefined、null、true、false、相同字符串、同一對象、NaN、+0、0、-0、數字時,返回true,其餘狀況返回false。code

var obj = {a: 1, b: 2};

console.log(Object.is(undefined, undefined));

console.log(Object.is(null, null));

console.log(Object.is(true, true));

console.log(Object.is(false, false));

console.log(Object.is('aaa', 'aaa'));

console.log(Object.is(obj, obj));

console.log(Object.is(NaN, NaN));

console.log(Object.is(-0, -0));

console.log(Object.is(+0, +0));

console.log(Object.is(0, 0));

console.log(Object.is(100, 100));
複製代碼

六、Object.preventExtensions()

限制對象不可擴展。 能夠經過Object.isExtensible()判斷對象是否被限制。對象

var obj = {a: 1, b: 2};

Object.preventExtensions(obj);

obj.c = 3;

console.log(obj);
複製代碼

七、Object.getOwnPropertyNames()

返回對象能夠遍歷的屬性的鍵名數組。ip

ES6的簡潔寫法爲:Object.keys(obj)

var obj = {a: 1, b: 2};

console.log(Object.keys(obj));
複製代碼

八、obj.hasOwnProperty()

判斷對象是否存在屬性

ES6簡潔寫法:key in obj

var obj = {a: 1, b: 2};

console.log(obj.hasOwnProperty('a')); // ES5

console.log('a' in obj); //ES6
複製代碼

九、Object.getOwnPropertyDescriptor()

查詢對象屬性的描述符。

var obj = {a: 1, b: 2};

console.log(Object.getOwnPropertyDescriptor(obj, 'a'));
複製代碼

十、Object.getOwnPropertyDescriptors()

查詢對象的描述符。

var obj = {a: 1, b: 2};

console.log(Object.getOwnPropertyDescriptors(obj));
複製代碼

十一、Object.getOwnPropertySymbols()

返回對象全部的Symbol值屬性鍵名數組。

var obj = {a: 1, b: 2, [Symbol('a')]: 3};

console.log(Object.getOwnPropertySymbols(obj));
複製代碼

十二、Object.defineProperties()

定義對象屬性。

var obj = {};

Object.defineProperties(obj, "val", {
    value: undefined, // 屬性值,默認undefined
    writable: false, // 是否可寫,默認false
    enumerable: false, // 是否可枚舉,默認false
    configurable: false, // 是否可配置,默認false
    get: undefined, // 該屬性的getter,默認undefined
    set: undefined, // 該屬性的setter,默認undefined
})
複製代碼

1三、Object.values()

返回對象全部的屬性值數組。

var obj = {a: 1, b: 2};

console.log(Object.values(obj));
複製代碼

1四、Object.entries()

返回對象全部屬性與屬性值的鍵值對列表。

var obj = {a: 1, b: 2};

console.log(Object.entries(obj));
複製代碼

1五、Object.fromEntries()

把鍵值對列表轉換爲一個對象。與Object.entries()方法相反。

var obj = {a: 1, b: 2};

var entries = Object.entries(obj);

console.log(Object.fromEntries(entries));
複製代碼

1六、Object.getPrototypeOf()

獲取對象的原型。至關於直接獲取obj.prototype。

var obj = {a: 1, b: 2};

console.log(Object.getPrototypeOf(obj));
複製代碼

1七、Object.setPrototypeOf()

設置對象的原型。至關於直接設置obj.prototype。

function Animal() {
    this.a = 1;
    this.b = 2;
}

var obj = {};

Object.setPrototypeOf(obj, new Animal());

console.log(obj.a);
複製代碼

1八、Object.toString()

返回當前對象的字符串形式。

原型方法

一、apply()

能夠修改this的指向,執行並返回改變指向後的函數的運行結果。

原函數的傳參以數組的方式傳入。

二、arguments

返回當前函數的實參列表。

get/set

三、bind()

能夠修改this的指向,返回改變指向後的函數。

四、call()

能夠修改this的指向,執行並返回改變指向後的函數的運行結果。

原函數的傳參以多個參數的的方式傳入。

get/set

五、caller()

返回函數的調用環境。

六、constructor()

返回當前對象的構造函數。

七、length

返回當前函數的形參個數。

八、name

返回當前對象的名稱。

九、toString()

返回當前對象的字符串形式。

十、Symbol.hasInstance

判斷某對象是否爲某構造器的實例。 用它自定義instanceof操做符在某個類上的行爲。

獲取Function原型的instanceof對應的方法

var func = () => {};
var obj = {};
var log1 = Function[Symbol.hasInstance](func, Function);
var log2 = Object[Symbol.hasInstance](obj, Object);
console.log(log1, log2)
複製代碼

自定義類,並重寫instanceof方法

class My {
	static [Symbol.hasInstance](instance) {
		console.log(instance)
		return true;
	}
	constructor() {
		this.a=1
	}
}
var my = new My()
console.log(my instanceof My)
複製代碼
相關文章
相關標籤/搜索