2016-11-19 2 views
0

다음 코드를 사용하여 객체 이름 ("객체 이름"은 아래 foo, bar, baz 및 jar를 나타냅니다.)을 찾으려고했습니다. 이것은 부적절한 용어이며, 웹이라는 용어를 사용하여 생성 된 함수의 값을 사용하여 웹에서 이와 같은 예제를 찾을 수 없습니다. 예를 들어주기 위해 : I는 각각 x와 y, 50, 100 두의 값을 가질 경우에 따라서생성자의 인수 값을 사용하여 객체 이름 찾기

function myFunction(){ 
    foo = new component(50, 50, "first", "red"); 
    bar = new component(50, 100, "sec", "red"); 
    baz = new component(0, 50, "third", "blue"); 
    jar = new component(0, 100, "fourth", "blue"); 
} 
function component(x, y, id, color){ 
this.x = x; 
this.y = y; 
this.id = id; 
this.color = color; 
} 

을, 어떤 방법 나는 프로그램이 이러한 값으로 생성자는 것을 인식 할 수 있도록를 만들기 위해 사용할 것 바? 두 값을 사용하여이 작업을 수행 할 수 없다면 하나의 값만 사용하면됩니다. 왜냐하면 두 값을 항상 하나로 결합 할 수 있기 때문입니다. 지금까지 내가 할 수 있었던 최선의 방법은 "foo instanceof component"가 사실이라는 것이 었습니다. 그래서 어쩌면 내가 찾지 못한 방법이있을 것입니다. 그것은 기본적으로 인스턴스의 반대입니다. 미리 감사드립니다.

+0

'foo','bar','baz' 및'jar'은 생성자가 아니며 객체입니다. 여기서'component'만이 생성자입니다. 그래도 나는 이해할 것 같아. 그래서 당신은'x'와'y'를 입력으로하고 그것과 연관된 객체를 돌려 주길 원합니까? – 4castle

+0

예, 정확하게 그 것입니다. 올바른 조건도 찾아 주셔서 감사합니다. – Gnago

답변

3

코드에서 foo, bar, bazjar은 생성자가 아니라 변수입니다. 이 변수는 component 함수를 사용하여 생성자로 생성 된 객체를 가리 킵니다.

x 및 y에 대한 특정 값을 사용하여 생성 된 개체를 찾는 것 같습니다. 그렇게하는 한 가지 방법은 키 x와 y의 조합 조회 테이블을 가지고하는 것입니다, 그 값은 객체 :

이 방법
var objects = {}; 
function component(x, y, id, color) { 
    this.x = x; 
    this.y = y; 
    this.id = id; 
    this.color = color; 

    // Insert the current object into the lookup table 
    objects[x + '_' + y] = this; 
} 

// Retreive an object from the lookup table 
function findObject(x, y) { 
    return objects[x + '_' + y]; 
} 

하나의 문제는 그 두 개의 개체를 만드는 경우 동일한 x 및 y 값은 마지막 테이블 만 룩업 테이블에 저장됩니다. 대신 각 키에 대한 객체 배열을 저장하여이를 해결할 수 있습니다.

+2

좋은 대답이지만, 나는이 자체가 포함 된 것을 제안 할 것입니다. [fiddle] (https://jsfiddle.net/o0aydkn3/)을 확인하여 제가 의미하는 바를 확인하십시오. 즉, "우발적으로"객체를 clobber 할 수있는 방법이 없습니다 '를 사용하고,'component.get'를 사용하면 '컴포넌트'를 얻는다는 것을 분명히 알 수 있습니다. –

+1

2 개의 객체가 동일한 x와 y 값을 가질 때까지 작동합니다. :-(또한, x와 y가 바뀌면 객체의 키도 바뀌어야합니다 . – RobG

+0

@RobG, 예, 이것이 문제가되었습니다. 나는 'console.log (foo)'를 할 때 x 및 y를 변경하면 'component {x : new value, y : new value, ...}'라고 표시되지만 원래 값을 사용하는 경우에만 구성 요소를 다시 선택할 수 있습니다. – Gnago

0

Jaromanda X의 자체 포함 코드와 함께 Nico 코드를 사용하여 사용자가 키를 찾을 수 있도록 개체를 업데이트 할 수있었습니다 (또는 변수가 무엇인지 "foo"가 무엇이든간에 여전히 확실하지 않습니다) 새로운 x 및 y 값을 기반으로합니다.

function myFunction(){ 
    foo = new component(50, 50, "first", "red"); 
    bar = new component(50, 100, "sec", "red"); 
    baz = new component(0, 50, "third", "blue"); 
    jar = new component(0, 100, "fourth", "blue"); 
} 
var component=(function(){ 
    var component=function(x, y, id, color){ 
    this.x = x; 
    this.y = y; 
    this.id = id; 
    this.color = color; 
    objects[x+'_'+y] = this; 
    this.newPos = function(x, y){ 
     this.x = x; 
     this.y = y; 
     //objects[this.x+"_"+this.y] = this; 
    }; 
    }; 
    component.get = function(x, y){ 
    return objects[x+'_'+y]; 
    }; 
    return component 
})(); 

'this.newPos'를 사용하면 매개 변수가 무엇인지 따라이 'x와 y를 변경하지만이 혼자 RobG으로, 키/변수의 원래 x와 y 값을 계속 사용하는 사용자를 강제로 지적했다. 이 문제를 해결하려면 newPos에서 주석을 제거하십시오. 이 코드는 'objects.x'와 'y'값을 newPos에있는 'this.x'와 'this.y'가 새로운 값이 될 값으로 만듭니다.

+1

명확히하기 위해'foo = ...'라고 쓰면 JS는'foo'라는 이름이 처음 언급 된 것을 알고 있으므로 배후에'var foo; '를 추가합니다. 예를 들어'x'는'foo.x' 또는'foo [ 'x']'를 사용하여 참조 할 수있는 foo의 키입니다. 즉, foo는 변수입니다. . – Nico