[笔记][JavaScript]物件间基本的原型链(2)

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()也可以先建立好物件后,再替物件指定原型。

以上如果有说明错误或不明白的地方,麻烦再留言告知我,我会尽速改正!!


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章