1、Object.getPrototypeOf(obj)
該方法返回 obj 對象的原型對象,等同於 obj.__proto__。獲取對象的原型對象推薦使用該方法而不是 obj.__proto__方法
function Person(){ this.name = 'jack' } let man = new Person(); console.log(Object.getPrototypeOf(man) === Person.prototype); //true console.log(Object.getPrototypeOf(man) === man.__proto__); //true
2、Object.defineProperty()
該方法會直接在一個對象上添加一個新屬性,或者修改一個對象的現有屬性, 並返回該對象。
Object.defineProperty(obj, prop, descriptor); //obj:要修改的對象 prop:要添加或修改的屬性的名稱。 descriptor:將屬性描述符。
let obj = {}; Object.defineProperty(obj, "key", { enumerable: false, configurable: false, writable: false, value: "static" });
3、Object.assign()
該方法用於將一個或多個源對象的所有可枚舉屬性的值復制到目標對象。它將改變目標對象然后返回目標對象。
Object.assign(target, source1, source2) //target:目標對象 source1、source:源對象
如果目標對象和源對象中的屬性名重復,那么源對象將覆蓋掉目標對象的屬性值,后面的源對象將覆蓋前面的源對象。
該方法是淺拷貝。假如源對象的屬性值是一個指向對象的引用,它也只拷貝那個引用值。
let obj1 = { a: 0, b: { c: 0 } }; let obj2 = Object.assign({}, obj1); console.log(obj2); // { a: 0, b: { c: 0}} obj1.a = 1; obj1.b.c = 3; //當源對象的屬性值是一個對象時,改變該屬性,目標對象也隨之改變 console.log(obj1); // { a: 1, b: { c: 3}} console.log(obj2); // { a: 0, b: { c: 3}}
可以利用JSON對象方法實現深拷貝
let obj1 = { a: 0, b: { c: 0 } }; let obj2 = JSON.parse(JSON.stringify(obj1)); obj1.a = 4; obj1.b.c = 4; //此時改變obj1屬性的值,obj2不會隨之改變 console.log(obj2); // { a: 0, b: { c: 0}}