프로토타입 체인 상속을 사용할 때 프로토타입에 메서드와 속성을 정의할 때 주의해야 합니다. 예상치 못한 결과가 발생할 수 있기 때문입니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!