您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

原型继承存在的部分问题

2025/5/5 4:58:06发布16次查看
当我们使用原型链继承时,需要谨慎的定义原型上的方法和属性,因为这可能带来意外的结果。
一、谨慎的定义原型上的方法。
当我们想为一个构造函数的原型上定义一个方法时,一定要在更改原型后再定义,否则新的原型对象上不会有定义的这个方法,导致与我们预期的结果不同。例:
1 function superobj(){} 2 superobj.prototype.sayhi=function sayhi(){ 3     console.log('hi'); 4 }; 5 superobj.prototype={ 6 name:'poly' 7 }; 8 var obj=new superobj(); 9 obj.sayhi();//报错!! superobj.sayhi is not a function
正确操作如下
1 function superobj(){} 2 superobj.prototype={ 3     name:'poly' 4 }; 5 superobj.prototype.sayhi=function sayhi(){6     console.log('hi');7 };8 var obj=new superobj();9 obj.sayhi();// 'hi'
二、不要使用对象字面量给原型创建属性/方法。
使用对象字面量,就会新创建一个对象,并把新对象的引用地址赋值给构造函数的prototype。例
1 function superobj(){} 2 superobj.prototype={ 3     sayhi:function sayhi(){ 4         console.log('hi'); 5     } 6 }
正确操作如下:
1 function superobj(){} 2 superobj.prototype.sayhi=function sayhi(){ 3     console.log('hi'); 4 }
三、对象实例与原型存在直接对应关系。
意思就是说当一个对__proto__就会保存原型的引用地址,即使构造函数的prototype发生改变,也不会对之前创建的实例中的__proto__产生影响。例
1 function superobj(){}   2 superobj.prototype.say=function() {   3     console.log('hello');   4 }   5 var obj=new superobj();  6 superobj.prototype={   7     say:function() {   8         console.log('world');   9     }  10 };  11 var obj2=new superobj();  12 obj.say();//'hello'  13 obj2.say();//'world'
四、最好不要给原型上定义值为引用类型的属性。
如果在原型上定义值为引用类型的属性,那么所有实例都会共享该属性值(引用类型值,指向同一个对象),当其中一个实例修改该引用类型上的值或属性时,所有实例上的都会发生改变。因此值为引用类型的属性,最好在构造函数中定义。例
1 function superobj(){} 2 superobj.prototype.ary=[1,2,3]; 3 var obj1=new superobj(); 4 var obj2=new superobj(); 5 obj1.ary[0]=0;//obj1.ary和obj2.ary指向的是同一个数组,当obj1修改此数组时,obj2.ary也会发生改变 6 console.log(obj2.ary[0]);//0

如果不想让实例共享同一个引用对象,那么就应该在构造函数中进行定义。例
1 function superobj(){ 2 this.ary=[1,2,3]; 3 } 4 var obj1=new superobj(); 5 var obj2=new superobj(); 6 obj1.ary[0]=0;//obj1.ary和obj2.ary指向的不是同一个数组,所以修改obj1.ary不会影响obj2.ary 7 console.log(obj2.ary[0]);//1
以上就是原型继承存在的部分问题 的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product