2015-01-21 2 views
3
나는 자바 스크립트의 각 "클래스"의 "개인"변수 상속의 여러 leveles을 조사하지만,이 독특한 특이점으로 실행했습니다

는 :자바 스크립트 프로토 타입 상속 개인 방법

function Ammo() { 
    var a = 0; 
    this.get_ammo = function() { 
     return a; 
    }; 

    this.add_to_ammo = function() { 
     a = a+1 
     return a; 
    }; 

    this.clean_ammo = function() { 
     return a=0; 
    } 
} 

function Weapon() { 
    var a =0; 
} 

function Gun() { 
    var a = 0; 
    this.fire = function(){ 
     console.log("Bang"); 
    } 
} 

Weapon.prototype = new Ammo(); 
Weapon.prototype.constructor = Weapon(); 

Gun.prototype = new Weapon(); 
Gun.prototype.constructor = Gun(); 

var a = new Ammo(); 
var w = new Weapon(); 
var g = new Gun(); 

a.add_to_ammo() 
a.add_to_ammo() 
a.add_to_ammo() 
console.log(w.get_ammo()) 
// At this point I get 0, as expected. But after 
w.add_to_ammo() 
w.add_to_ammo() 
w.add_to_ammo() 
console.log(g.get_ammo()) 
// But here I get 3! 

누군가는 설명 할 수 이유 나는 그 g 그래서, 독립적으로 자신의 분야이며, w를하는 개체를 생각 3

console.log(g.get_ammo()) 

후 얻을.

또한 내가 변경하는 경우

var a = 0; 

this.a = 0; 

에 나는 결과를 예상 얻을 것을 알아 냈다. 개체의 필드는 부모 필드에 바인딩되지 않습니다.

답변

4

var aAmmo에 정의되어 있지만, 다른 생성자에서는 var a이 전혀 없습니다. aAmmo의 클로저에 캡처 된 인스턴스가 항상 a 인 경우에도 메서드를 호출 할 때 수정됩니다.

자바 스크립트에서 원하는대로 개인 변수를 사용할 수는 없으므로 좋습니다.

function Ammo() { 
    this._ammo = 0; 
} 

는 그 다음 prototype에 메소드를 추가하고 그 변수를 참조 this._ammo를 사용을 할 수있는 가장 일반적인 방법은 변수 대중을하고, 밑줄을 앞에, "내부"로 표시하는 것입니다

Weapon.prototype = Object.create(Ammo.prototype); 

을 그리고 생성자에서 "슈퍼 전화": : :

Ammo.prototype.getAmmo = function() { 
    return this._ammo 
} 

은 그럼 당신은 Object.create으로 상속 할 수 있습니다

function Weapon() { 
    Ammo.call(this) // gets own "_ammo" 
} 

또한 생성자 함수를 올바르게 설정하지 않았습니다.

Weapon.prototype.constructor = Weapon; 
Gun.prototype.constructor = Gun; 
0

내가 @elclanrs 대답에 대해 언급하기에 충분한 담당자 포인트가없는, 그래서 용서 : 당신은 기능을 할당해야한다, 그것을 호출하지.

그의 대답은 모두 정확하지만 정보의 대부분의 관련 부분은 제대로 생성자 함수를 설정하지 않는, 또한 마지막

입니다. 당신은 기능을 할당해야한다, 그것을 호출하지 :

Weapon.prototype.constructor = Weapon; 
Gun.prototype.constructor = Gun; 

기능 폐쇄의 범위 내에서 선언 된 당신의 변수는 PRIVATE 사실에있다! 그러나 서브 클래 싱 객체를 올바르게 인스턴스화하지 못했기 때문에 프랑켄슈타인의 일이 진행되었습니다. 하나의 객체와 많은 신체 부분이있었습니다.

본질적으로 코드에 문제가있는 것은 아니지만 사람들이 일반적으로 "클래스"라고 쓰는 방식이 아니며이 질문의 맥락에서 왜 설명하지 않겠습니다.

관련 문제