2009-11-03 7 views
2

자바 스크립트에서 모든 객체는 프로토 타입을 가지고 있습니다. 모든 프로토 타입은 객체이므로 모든 프로토 타입에는 프로토 타입이 있습니다.자바 스크립트 : 프로토 타입 체인 설정

var Person = function (name) { 
    this.name = name; 
} 

Person.prototype = { 
    walk: function() { 
     alert(this.name + ' is walking'); 
    } 
} 

var walter = new Person('Walter'); 

내가 걸을 수 :

날입니다

사람들이 날 수 있는지 궁금
walter.walk() // => "Walter is walking" 

?

Person.prototype = { 
    walk: function() { 
     alert(this.name + ' is walking'); 
    } 
} 

Person.prototype.prototype = new WingedAnimal(); 

var walter = new Person('Walter'); 

walter.walk() // => 'Walter is walking' 

walter.fly(); 

형식 오류 : 다음

확인하는 기능이 아닌) walter.fly (:

var WingedAnimal = function() { 
    this.hasWings = true; 
} 

WingedAnimal.prototype = { 
    fly: function() { 
     alert(this.name + ' is flying') 
    } 
} 

var Person = function (name) { 
    this.name = name; 
} 

Person.prototype = { 
    walk: function() { 
     alert(this.name + ' is walking'); 
    }, 
    prototype: new WingedAnimal() 
} 

var walter = new Person('Walter'); 

walter.walk() // => 'Walter is walking' 

walter.fly(); 

형식 오류를 : 프로그래머는, 난 그냥 비행 사람들이 수 할 것 신들 : walter.fly()는 함수가 아닙니다.

정말 이렇게 할 방법이 없습니까? 제 말은, 여러 객체를 하나의 프로토 타입으로 혼합하는 대신 프로토 타입 체인을 사용하는 것입니까?

나는 내 질문에 명확히하기 위해 ...하지만 여전히 함께


물건을 혼합 싫어하지 않는 것이 : 나는 이미 나는 보통 를 호출하는 기능과 함께이 문제를 해결 한 순간

을 혼합하고 일반적으로 CORE이라는 네임 스페이스에 넣습니다. 이 함수는 전달 된 모든 객체의 멤버를 첫 번째 객체에 복사합니다. 내 코드는 일반적으로 다음과 같습니다 SomeInterface에서

var Constructor = function() { 
    // stuff 
} 

CORE.mix(Constructor.prototype, SomeInterface, AnotherInterface, { 
    //stuff that goes only into objects made with Constructor 
}); 

모든 것이, AnotherInterface 및 문자 개체가 Constructor.prototype로 끝나는, 우선 오른쪽으로 왼쪽으로. 그러나 이것은 Javascript가 어떻게 동작해야한다고 생각하지 않습니다. 제 생각에 프로토 타입 체인이 있어야합니다. 프로토 타입 하나에 여러 가지 물건이 섞여있는 것은 아닙니다.

someObject.method를 호출하면 메서드을 someObject로 검색해야합니다. 존재하지 않으면 someObject.prototype으로 검색해야합니다. 다음 someObject.prototype.prototype; 프로토 타입이 정의되지 않은 프로토 타입을 가질 때까지 계속 실패합니다. 이것이 내가 this great explanation에서 이해하는 방법입니다. 내가 잘못? 각 객체의 프로토 타입은 실제로 사용할 수 있습니까?

답변

2
Person.prototype= { 
    walk: function() { 
      alert(this.name + ' is walking'); 
    }, 
    prototype: new WingedAnimal() 
} 

작동하지 않습니다 : 그러나 이것은 또한 기초를하려고 점에서 결함이

Person.prototype= new WingedAnimal(); 
Person.prototype.walk= function() { 
    alert(this.name + ' is walking'); 
}; 

다음 prototype 속성은하지 프로토 타입 객체에 생성자 함수에 살고 인스턴스의 클래스; 생성자가 아무 것도하지 않기 때문에 WingedAnimal에서 작동하지만 더 복잡한 작업을 혼동하게 만드는 나쁜 패턴입니다 (여러 JS JS 튜토리얼에 의해 공표 됨).

JavaScript의 프로토 타이핑에 대한 개요는 this question을 참조하십시오.

+0

그 덕분에 몇 가지 점이 분명해졌습니다. 같은 프로토 타입에 모든 것을 혼합하는 것이 더 나은 방법이라고 생각하십니까? –

+0

글쎄, 뭐든간에. 당신은 대답했습니다. 나는 나머지를 나 자신으로 분류 할 것입니다. –

+0

WingedAnimal과 Person을위한 하나의 프로토 타입입니까? 나는 이것이 단지 예시 일 뿐이며 실제 사례는 그 자체의 장점으로 판단되어야 할 것이라고 기대하고있다. 개인적으로는 Java 스타일의 깊은 상속을 위해 상대적으로 얕은 프로토 타입 트리를 선호하지만 Person을 WingedAnimal로 만들지는 모른다. (!) – bobince

3

나는 프로토 타입 속성을 오해하고 있다고 생각합니다. 모든 객체에는 프로토 타입에 대한 내부 참조가 있지만 모든 브라우저에서이 객체를 직접 가져 오거나 설정할 수있는 방법은 없습니다. prototype 속성은 생성자 함수에 할당 된 경우에만 유용합니다.

Person.prototype = new WingedAnimal(); 

Person.prototype.walk = function() { 
    alert(this.name + ' is walking'); 
}; 

var walter = new Person('Walter'); 

walter.walk() // => 'Walter is walking' 

walter.fly(); 
관련 문제