使用Object.setPrototypeOf()設置對象的原型

此方法可以設置對象的原型。
Object.setPrototypeOf方法是針對對象實例的,而不是構造函數(類),此方法修改的是對象實例的內部屬性[prototype],也就是_proto_屬性所指向的對象,它只是修改了特定對象上的原型對象,對於構造函數的prototype指向的原型對象沒有影響。那是不是此方法就不能針對構造函數了,因爲構造函數本身也是function(類)的實例。
ES2015新增此方法。
語法結構:
Obejct.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對象。

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方法修改對象實例的原型對象,不會對其他對象的原型對象產生影響。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章