2013-03-07 4 views
6

JavaScript에서는 객체 리터럴에 프로토 타입 연결이 있지만, 함수 객체에는 프로토 타입 연결과 프로토 타입 속성이 모두 있다고합니다.자바 스크립트 상속 및 객체 리터럴

위의 내용을 기반으로 상속 (프로토 타입 속성을 사용)은 객체 리터럴이 아닌 함수 객체 (생성자 버전)에서만 가능하다고 할 수 있습니까? 추가 또한

은의 __proto__ 속성은 ...

+1

당신은 내가 제대로 질문을 이해한다면, 나는 예라고 말하고 싶지만, 기존 객체의 프로토 타입을 변경하거나 객체 리터럴을 사용할 때 프로토 타입을 지정, 그렇게 할 수 없다. –

+0

그래서 대부분의 브라우저 동작 (파이어 폭스처럼 "__proto__"연결을 설정할 수있는 것을 제외하고)을 참조 할 것입니다 ... 그래서 상속을 Object 리터럴을 사용하여 구현할 수 있다고 말할 수 있습니다 (단, __proto__ 설정을 허용하는 브라우저에서만 가능함). Firefox와 같은 링크)? – testndtv

+0

Object 리터럴 자체는'Object.prototype'에서 상속되므로 여전히 상속을 받고 있지만 생성자와 마찬가지로 리터럴 구문을 사용할 때보다 긴 프로토 타입 체인을 설정할 수 없습니다. 그리고 생성자 만이 유일한 방법은 아닙니다. 대신에,'Object.create'를 사용할 수 있습니다. –

답변

2

짧은 버전 모든 브라우저에서 액세스 할 수 없습니다 :

예 : 프로토 타입 체인은에 할당하여 설정하거나 수정할 수 없습니다 개체의 prototype 속성 개체 리터럴을 사용하여 개체를 만든 다음 prototype이라는 속성을 지정하여 상속을 설정할 수는 없습니다. 이러한 속성은 prototype이라고하지만 프로토 타입 상속으로 간주되지 않습니다.

긴 : 해당 객체의 상속 체인이 선택되어 undefined 인 속성에 액세스하는 경우

. 따라서 obj['prop']undefined 인 경우 obj.prototype['prop']이 확인됩니다. 많은 브라우저에서 prototype 속성은 내부적으로 __proto__ 속성으로 구현되지만 그 점 외에도 있습니다. 오히려 요점은 일부 속성이 undefined 인 경우 개체의 프로토 타입이 해당 속성에 대해 검사된다는 것입니다.

사람들이 코멘트에서 말했듯이, 그 개체를 함수의 prototype 속성에 할당하고 그 함수를 생성자로 사용하여 위에서 설명한 상속을 제공하는 프로토 타입으로 개체를주는 것만 가능합니다.

그러나 생성자 호출에 의해 생성 된 개체의 속성은 object.hasOwnProperty('prototype')이 아닙니다. 반면에 prototype 속성을 객체에 할당하면 해당 객체는 object.hasOwnProperty('prototype')이되지만 object.prototype은 프로토 타입 체인과 아무 관련이 없습니다.이 속성은 일반 속성 일 뿐이며 prototype .

이를 보여주기 위해 :

var foo = {}; 
foo.prototype = {bar: 'hello'}; 
console.log(foo.bar); // undefined 
console.log(foo.prototype); // Object {bar: "hello"} 
console.log(foo.hasOwnProperty('prototype')); // true 

var Foo = function() {}; 
Foo.prototype = {bar: 'hello'}; 
var f = new Foo; 
console.log(f.bar); // 'hello'; 
console.log(f.hasOwnProperty('bar')); // false 
console.log(f.prototype); // undefined 
console.log(f.hasOwnProperty('prototype')); // false 
관련 문제