Object.setPrototypeOf()
此方法可以設定物件的原型。
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);
程式碼執行效果截圖如下:
上述程式碼將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);
程式碼執行效果截圖如下:
程式碼分析如下:
(1).為建構函式Antzone原型物件新增一個屬性address。
(2).通過建構函式Antzone建立兩個例項物件。
(3).然後通過Object.setPrototypeOf方法更改one物件的原型物件,更改為proto物件。
(4).現在看列印結果,由於one物件的原型物件被修改,新的原型物件中並沒有address屬性,所以one物件的address屬性值是undefined。two物件的address屬性依然"青島市南區",可以看到通過Object.setPrototypeOf方法修改物件例項的原型物件,不會對其他物件的原型物件產生影響。