时间:2021-05-26
当我们使用原型链继承时,需要谨慎的定义原型上的方法和属性,因为这可能带来意外的结果。
一、谨慎的定义原型上的方法。
当我们想为一个构造函数的原型上定义一个方法时,一定要在更改原型后再定义,否则新的原型对象上不会有定义的这个方法,导致与我们预期的结果不同。例:
function superObj(){}superObj.prototype.sayHi=function sayHi(){ console.log('hi');};superObj.prototype={ name:'Poly'};var obj=new superObj();obj.sayHi();//报错!! superObj.sayHi is not a function正确操作如下
function superObj(){}superObj.prototype={ name:'Poly'};superObj.prototype.sayHi=function sayHi(){ console.log('hi');};var obj=new superObj();obj.sayHi();// 'hi'二、不要使用对象字面量给原型创建属性/方法。
使用对象字面量,就会新创建一个对象,并把新对象的引用地址赋值给构造函数的prototype。例
function superObj(){}superObj.prototype={ sayHi:function sayHi(){ console.log('hi'); }}正确操作如下:
function superObj(){}superObj.prototype.sayHi=function sayHi(){ console.log('hi');}三、对象实例与原型存在直接对应关系。
意思就是说当一个对__proto__就会保存原型的引用地址,即使构造函数的prototype发生改变,也不会对之前创建的实例中的__proto__产生影响。例
function superObj(){}superObj.prototype.say=function() { console.log('hello');}var obj=new superObj();superObj.prototype={ say:function() { console.log('world'); }};var obj2=new superObj();obj.say();//'hello'obj2.say();//'world'四、最好不要给原型上定义值为引用类型的属性。
如果在原型上定义值为引用类型的属性,那么所有实例都会共享该属性值(引用类型值,指向同一个对象),当其中一个实例修改该引用类型上的值或属性时,所有实例上的都会发生改变。因此值为引用类型的属性,最好在构造函数中定义。例
function superObj(){}superObj.prototype.ary=[1,2,3];var obj1=new superObj();var obj2=new superObj();obj1.ary[0]=0;//obj1.ary和obj2.ary指向的是同一个数组,当obj1修改此数组时,obj2.ary也会发生改变console.log(obj2.ary[0]);//0如果不想让实例共享同一个引用对象,那么就应该在构造函数中进行定义。例
function superObj(){ this.ary=[1,2,3];}var obj1=new superObj();var obj2=new superObj();obj1.ary[0]=0;//obj1.ary和obj2.ary指向的不是同一个数组,所以修改obj1.ary不会影响obj2.aryconsole.log(obj2.ary[0]);//1以上这篇详谈js原型继承的一些问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
温馨提示:想要更好的理解JS继承方式,须了解构造函数、原型对象、实例化对象、原型链等概念第一种:原型链继承利用原型链的特点进行继承functionParent(
最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是
本文实例讲述了JS实现继承的几种常用方式。分享给大家供大家参考,具体如下:1,原型链继承原型链继承/***优点:*实例是父类的实例也是子类的实例*父类新增原型方
一:js原型继承四步曲//js模拟类的创建以及继承//动物(Animal),有头这个属性,eat方法//名字这个属性//猫有名字属性,继承Animal,抓老鼠方
本文分享了js对象继承的N种模式,供大家参考。一、原型链继承functionPerson(){};Person.prototype={constructor:P