HIHI,继上一篇[笔记][JavaScript]物件间基本的原型链(1)讲了Object.create()
的方式后,这次来提一下Object.setPrototypeOf()
,我觉得这个Object.setPrototypeOf()
物件函式会比Object.create()
还要来得灵活,因为Object.setPrototypeOf()
可以在两个物件都存在时,直接指定一个物件给另一个物件当原型,不过这个物件函式的浏览器支援度比Object.create()
还要低多了,详细的支援度可以参考这里,主要是IE的部分,其他浏览器都差不多,大家也可以衡量一下需求做取捨,那现在来直接实作Object.setPrototypeOf()
看看。
//宣告一个A物件var objA = {writeNameA:function(){console.log('objA is '+this.name);},};//再宣告一个B物件var objB = {name:'B',};//现在我们用Object.setPrototypeOf()来实作继承//第一个参数要继承物件,第二个参数为原型物件Object.setPrototypeOf(objB,objA);//继承后objB就会有objA的特性了objB.writeNameA(); //会印出'objA is B//来试着使用Object.isPrototypeOf(obj)判断原型objA.isPrototypeOf(objB); //会回传true
以上是Object.setPrototypeOf()
使用方式,但就像上一篇文章说的,每个物件的原型都只能有一个,所以如果对同一个物件重複设定原型,那前面设定的原型物件会被后来的物件原型盖过去。
//多宣告一个C物件var objC = {writeNameC:function(){console.log('objC is '+this.name);},};//然后设定objC为objB的原型Object.setPrototypeOf(objB,objC);//宣告函式会发现objB的原型objA已经变成objC了objB.writeNameC(); //会印出'objC is B//然后我们去检查他现在的原型是不是objA还是objCobjA.isPrototypeOf(objB); //会回传falseobjC.isPrototypeOf(objB); //会回传true
虽然没有办法指定多个原型,但是就像上一篇说的,我们可以把objC设定为objA的原型,再把objA设定为objB的原型,让objB同时有objA和objC的特性,形成一个原型链可以使用。
//首先设定objC为objA的原型Object.setPrototypeOf(objA,objC);//再设定objA为objB的原型Object.setPrototypeOf(objB,objA);//之后我们来调用从objA和objC继承来的特性试试objB.writeNameA(); //会印出'objA is BobjB.writeNameC(); //会印出'objC is B//用Object.isPrototypeOf()来确认objB和objC是否在同一个原型链上objC.isPrototypeOf(objB); //会回传true
这篇的Object.setPrototypeOf()
和上一篇的Object.create()
不同的是他不需要在建立物件的同时指定原型,Object.setPrototypeOf()
也可以先建立好物件后,再替物件指定原型。
以上如果有说明错误或不明白的地方,麻烦再留言告知我,我会尽速改正!!