Object.setPrototypeOf()

admin發表於2018-09-23

此方法可以設定物件的原型。

Object.setPrototypeOf方法是針對物件例項的,而不是建構函式(類),此方法修改的是物件例項的內部屬性[[Prototype]],也就是__proto__屬性所指向的物件,它只是修改了特定物件上的原型物件,對於建構函式的prototype指向的原型物件沒有影響。那是不是此方法就不能針對建構函式了,那也不是,因為建構函式本身也是Function(類)的例項。

ES2015新增此方法。

語法結構:

[JavaScript] 純文字檢視 複製程式碼
Object.setPrototypeOf(obj, proto);

引數解析:

(1).obj:必需,對其設定原型的物件。

(2).proto:必需,新的原型物件。

瀏覽器支援:

(1).IE11瀏覽器支援此方法。

(2).edge瀏覽器支援此方法。

(3).火狐瀏覽器支援此方法。

(4).谷歌瀏覽器支援此方法。

(5).opera瀏覽器支援此方法。

(6).safria瀏覽器不支援此方法。

程式碼例項如下:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let proto = {
  url:"www.softwhy.com"
};
let obj = {
  webName:"螞蟻部落",
  age:4
};
Object.setPrototypeOf(obj, proto);
console.log(obj.url);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/23/101511i1tp0vsxjvv0xf00.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

上述程式碼將obj物件的原型物件設定為proto物件。

[JavaScript] 純文字檢視 複製程式碼執行程式碼
function Antzone(){
  this.webName="螞蟻部落";
  this.age=4;
}

let proto = {
  url:"www.softwhy.com"
};

Antzone.prototype.address="青島市南區";
let one=new Antzone();
let two=new Antzone();
Object.setPrototypeOf(one, proto);
console.log(one.address);
console.log(two.address);

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201809/23/101546s5evg65oigiu82zo.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

程式碼分析如下:

(1).為建構函式Antzone原型物件新增一個屬性address。

(2).通過建構函式Antzone建立兩個例項物件。

(3).然後通過Object.setPrototypeOf方法更改one物件的原型物件,更改為proto物件。

(4).現在看列印結果,由於one物件的原型物件被修改,新的原型物件中並沒有address屬性,所以one物件的address屬性值是undefined。two物件的address屬性依然"青島市南區",可以看到通過Object.setPrototypeOf方法修改物件例項的原型物件,不會對其他物件的原型物件產生影響。