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