>웹 프론트엔드 >JS 튜토리얼 >프로토타입 상속의 몇 가지 문제

프로토타입 상속의 몇 가지 문제

一个新手
一个新手원래의
2017-09-06 11:48:591100검색

프로토타입 체인 상속을 사용할 때 프로토타입에 메서드와 속성을 정의할 때 주의해야 합니다. 예상치 못한 결과가 발생할 수 있기 때문입니다.

1. 프로토타입의 메서드를 신중하게 정의하세요.
생성자의 프로토타입에 메서드를 정의하려면 프로토타입을 변경한 후 메서드를 정의해야 합니다. 그렇지 않으면 새 프로토타입 객체에 이 메서드가 정의되지 않아 예상과 다른 결과가 발생합니다. 예:


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'

2. 프로토타입의 속성/메서드를 생성하기 위해 객체 리터럴을 사용하지 마세요.
객체 리터럴을 사용하면 새 객체가 생성되고 새 객체의 참조 주소가 생성자의 프로토타입에 할당됩니다. 예시


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 }

3. 객체 인스턴스와 프로토타입 사이에는 직접적인 대응이 있습니다.
즉, __proto__에 대한 참조가 생성되면 프로토타입의 참조 주소가 저장됩니다. 생성자의 프로토타입이 변경되더라도 이전에 생성된 인스턴스의 __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'

4. 프로토타입에서는 참조 유형으로 속성을 정의하지 않는 것이 가장 좋습니다.
프로토타입에서 참조 유형으로 속성을 정의하면 모든 인스턴스가 속성 값(동일한 개체를 가리키는 참조 유형 값)을 공유합니다. 인스턴스 중 하나가 참조 유형의 값이나 속성을 수정하면 모든 인스턴스가 변경됩니다. 위의 모든 내용이 변경됩니다. 따라서 값이 참조 유형인 속성은 생성자에서 가장 잘 정의됩니다. 예


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
<br/>

인스턴스가 동일한 참조 개체를 공유하는 것을 원하지 않으면 생성자에서 이를 정의해야 합니다. 예


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

위 내용은 프로토타입 상속의 몇 가지 문제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.