2013-05-17 5 views
1

의이 예제를 보자 :특정 프로토 타입으로 모든 요소를 ​​가져 옵니까?

var Point = new function(){}; 

var Line = function(){}; 
    Line.prototype = new Point(); 

var line2 .... 

내가 포인트를 프로토 타입 모든 개체를 찾을 수 wan't. 일부 코드 나는 시도했지만 그 작동하지 :

for(key in window) { 
    if(this[key] instanceof Point){ // <== using instanceof here 
    console.log(this[key]); 
    } 
} 

그러나 : 당신이 instanceof로 예에 ==을 변경하는 경우

for(key in window) { 
    if(this[key] == Point){ // typeof is also not working. 
    console.log(this[key]); 
    } 
} 
+0

'Line.prototype = new Point();'? 'Point()'를 인스턴스화하는 속성을 찾으십니까? – adeneo

+0

@adeneo 예, 그게 내가 찾고있는 것입니다. – Kivylius

답변

5

, 그것은 자신의 프로토 타입으로 Point 개체가 모든 글로벌 변수를 작동합니다 Point의 정의에 오류가 있습니다. 나중에 Point을 함수로 사용하기 때문에 new을 원하지 않습니다. 그러나 new function() { }은 익명 함수가 생성자 인을 호출하고 new으로 만든 비 함수 개체를 반환합니다.

전체 작업 예제 : Live Copy | 위의 Live Source

var Point = function(){}; 

var Line = function(){}; 
    Line.prototype = new Point(); 

var lineInstance = new Line(); 
var pointInstance = new Point(); 

for(key in window) { 
    if(window[key] instanceof Point){ 
    console.log(key + " is 'instanceof' Point"); 
    } 
} 

참고 :

  • 첫 번째 회선에 new.

  • 실제로는 new Pointnew Line을 사용하여 개체를 만듭니다.

  • 루프의 두 위치에서 모두 window을 사용했습니다. 한 곳에서 window을 사용하지만 다른 곳에서는 this을 사용하는 것이 혼란 스럽습니다 (이 경우 두 곳 모두 동일한 객체를 참조 함). 당신의 목표는 자신의 prototype 재산으로 Point 객체를 사용하는 함수 (라인 Line를) 찾을 경우


(해당 속성이 하지 어떤 객체의 프로토 타입입니다 있습니다,하지만 이 될 것입니다new을 통해 해당 기능을 통해 생성 된 객체의 프로토 타입) 다음 prototype 속성을 확인하십시오. Live Copy |

  • :


    Live Source

    for(key in window) { 
        if(typeof window[key] === "function" && 
        window[key].prototype instanceof Point){ 
        console.log(key + " is a function using Point as its prototype property"); 
        } 
    } 
    
    여기 문제가 서로 다른 있지만 관련된 것들 객체의 프로토 타입의 개념과 기능의 prototype 속성을 착각하고 있다는 것 같아요 함수의 속성 인 prototype은 다음과 같습니다. 함수의 속성입니다. 만약 new 통해 함수를 호출하여 객체를 생성
  • (예컨대, 그것을 생성자 함수로 사용하는 경우), new을 사용하여 호출하는 동안 발생하는 작업 중 하나는 새 객체가 생성되고 해당 프로토 타입 (객체의 모든 속성으로 액세스 할 수 없음)을 생성자 함수 prototype 속성

이 가장 일례로 설명한다 :

function Foo() { 
} 
Foo.prototype.bar = 42; 

var f = new Foo(); 
console.log(f.bar); // "42" 

Foo 함수 prototype라는 속성을 갖는다. new Foo을 통해 새 객체를 만들면 기본 프로토 타입이 Foo.prototype에서 가져옵니다. 따라서 해당 객체에서 속성을 찾고 자체 복사본이없는 경우 JavaScript 엔진은 프로토 타입을보고 인지 확인합니다. 하나있다. 그리고 위의 마지막 줄은 콘솔에 "42"을 로깅합니다.

(* 객체의 기본 프로토 타입은 객체의 속성으로 액세스 할 수 없다고 말하면 표준에 따라 JavaScript에 해당합니다. 그러나 많은 엔진에서 제공하는 확장자가 아닌 확장이 있습니다. , __proto__이라는 정확히 일치하는 : 개체의 기본 프로토 타입. 그러나 표준이 아닙니다. 개체를에 전달하여 개체의 프로토 타입을 가져올 수 있습니다.


그리고 마침내 아마도 예기치 않게 예일 수도 있지만, 보통은 기대하지 않을 것입니다. LinePoint에서 상속되며 "is a"관계가 없으므로 (LinePoint이 아닙니다). 여기서 일반적인 관계는 구성 인이고 상속은 아닐 것입니다. LinePoints이지만, LinePoint이 아닙니다.

+0

웬일인지 이것이 작동하지 않습니다 : http://jsfiddle.net/CezarisLT/FYQER/ – Kivylius

+0

@Jessica : 그건 당신의'Point' 정의에 잘못된'new'가 있기 때문입니다. 업데이트 된 답변 및 예를 참조하십시오. –

+0

@Jessica : 귀하의 바이올린은 프로토 타입으로'Point'를 사용하여 어떤 객체도 만들지 않습니다. 완전히 다른 점이있는'prototype' 속성으로'Point'를 사용하는 함수 만 생성합니다. –

0

모든 요소의 프로토 타입이 다른 Point 인스턴스이므로 모든 요소의 프로토 타입이 달라집니다.

동일한 프로토 타입을 모두 사용해도 비교할 수 있습니다. 그렇지 않으면 T.J.로하십시오. Crowder가 말하길 instanceof을 사용하십시오.

관련 문제