1. 程式人生 > 其它 >js高階-理解並區分Object.create(null) 和 {}

js高階-理解並區分Object.create(null) 和 {}

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)

輸出到控制檯,可以發現它繼承了原型物件Object的所有屬性和方法,toString()

(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)

3.優點

  另一個使用create(null)的理由是,在我們使用for..in迴圈的時候會遍歷物件原型鏈上的屬性,使用create(null)就不必再對屬性進行檢查了,當然,我們也可以直接使用Object.keys[]