js高階-理解並區分Object.create(null) 和 {}
阿新 • • 發佈:2022-01-03
1.object.create() 定義
首先呼叫這個函式會建立一個新的物件
這個新物件的隱式原型屬性會指向輸入的proto,也就是proto是這個物件的原型物件
MDN上寫的很清楚
Object.create(proto,[propertiesObject])
// proto:新建立物件的原型物件
// prototypeObject: 可選 他是新增到新建立物件中的屬性 類似object.proportydefine()
const car = {
isSportsCar: false,
introduction: function () {
console.log(`Hi girl, this is a ${this.name}.
Do you like to have a drink with me ? ${this.isSportsCar}`);
}
};
const porsche = Object.create(car,{
//color成為porsche的資料屬性
//顏色不喜歡,可以改色或貼膜,所以可修改
color:{
writable:true,
configurable:true,
value:'yellow'
},
//type成為porsche的訪問器屬性
type:{
// writable、configurable等屬性,不顯式設定則預設為false
// 想把普通車改成敞篷,成本有點大了,所以就設成不可配置吧
get:function(){return 'convertible'},
set:function(value){"change this car to",value}
}
});
porsche.name = "Porsche 911"; // "name"是"porsche"的屬性, 而不是"car"的
porsche.isSportsCar = true; // 繼承的屬性可以被覆寫
porsche.introduction();
// expected output: "Hi girl, this is a Porsche 911. Do you like to have a drink with me ? true"
//copy的一個簡單例子
作者:司想君
連結:https://juejin.cn/post/6844903589815517192
來源:稀土掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
2.Object.create() , {} 在建立一個物件時的區別
(1){}
var o = {
a:10
};
console.log(a)
(2)Object.create()建立物件
// new Object() 方式建立
var a = { rep : 'apple' }
var b = new Object(a)
console.log(b) // {rep: "apple"}
console.log(b.__proto__) // {}
console.log(b.rep) // {rep: "apple"}
// Object.create() 方式建立
var a = { rep: 'apple' }
var b = Object.create(a)
console.log(b) // {}
console.log(b.__proto__) // {rep: "apple"}
console.log(b.rep) // {rep: "apple"}
//(1)對比可以發現Object.create()方法建立的物件在不新增新屬性的情況下,是一個空物件,這裡她先繼承了a作為原型物件(但是因為a是new建構函式方法建立的物件,所以還是會繼承Object,b仍然能通過a從原型鏈訪問到Object中的方法)
(3)object.create(null) 建立純淨原型物件
當proto引數傳入null時,建立的新物件就沒有原型物件,那也就無所謂繼承的方法了,我們可以在新物件的原型上輕鬆的重寫toString()等常用方法而不用擔心覆蓋原型鏈上原生方法
var o = Object.create(null,{
a:{
writable:true,
configurable:true,
value:'1'
}
})
console.log(o)
另一個使用create(null)
的理由是,在我們使用for..in
迴圈的時候會遍歷物件原型鏈上的屬性,使用create(null)
就不必再對屬性進行檢查了,當然,我們也可以直接使用Object.keys[]
。