2011-10-06 6 views
1
function Person(){ 
    this.scream = function(){ 
     alert('NO NO NO!!!!'); 
    }; 
} 

var steve = new Person(); 
steve.scream() // NO NO NO!!!! 
Person.prototype.scream = function(){ 
    alert('YES YES YES!!!!'); 
} 
steve.scream() // still NO NO NO!!!! 

명시 적으로 스티브를 참조하지 않고 ' 비명'오버라이드 (override) 할 수있는 방법이 있나요? 사례가있는 경우를 생각해보십시오. 사람.javascript : 일부 클래스의 모든 인스턴스에 대해 메소드를 재정의하는 방법은 무엇입니까?

답변

2

아니,

Person 선언, 때마다 당신이 "생성자"실행 그것의 새로운 "예"를 만들고 완전히 새로운 scream 기능 (폐쇄)를 만들거야 가졌있는 당신을 새로 생성 된 객체 인 steve.scream 인 경우를 제외하고는 참조 할 항목이 없습니다. 대안으로

이 같은 그것을 할 수 있습니다 초기 scream "방법"프로토 타입에, 단 하나 개의 장소에서 사용할 수 있으며, 모든 "인스턴스를 덮어 쓸 수있는 경우

function Person(){} 

Person.prototype.scream = function(){ 
    alert('NO NO NO!!!!'); 
} 

var steve = new Person(); 
steve.scream() // NO NO NO!!!! 
Person.prototype.scream = function(){ 
    alert('YES YES YES!!!!'); 
} 
steve.scream() // this time is YES YES YES!!!! 

". 당신이 당신의 코드 스타일을 계속 사용하려는 경우, 당신이 좋아하는 수

1
function Person(){}; 
Person.prototype.scream = function(){ alert('NO NO NO!!!!'); }; 
var steve = new Person(); 
steve.scream(); 
Person.prototype.scream = function(){alert('YES YES YES!!!!');}; 
steve.scream(); 
0

하고,

function Person(){ 
    this.constructor.prototype.scream = function(){ 
     alert('NO NO NO!!!!'); 
    }; 
} 
var steve = new Person(); 
steve.scream(); 
Person.prototype.scream = function(){ alert('YES YES YES!!!!'); }; 
steve.scream(); 
+0

생성자 체인 –

+0

은 또한 폐쇄에 대한 액세스가 손상 당신의 프로토 타입을 변경하기 때문에이 다른 BTW, 아마도 잘못 . scream 함수는 모든 인스턴스에 공통적 인 반면 클로저는 인스턴스마다 있어야합니다. – viebel

관련 문제