2016-06-16 2 views
1

겹치는 키 검색 용어 때문에 찾기가 정말 까다 롭습니다. 나는이 회로 게임을 만들고있다. 참고로, 스타일 측면에서 볼 때 조금 변경 될 수도 있지만 (예 : number_of_boards 또는 기타), 다른 것들에는 재사용되지 않지만 속성 이름은 다시 사용됩니다 (예 : 내가하지 않으려는큰 개체의 함수로 사용 된 개체 생성자

CIRCUIT_BOARD = { 
    "blankGridSquare": function(){ 
     //Returns brand new object that is one blank grid square of the map 
    } 
    , "blankMap": function(width,height){ 
     //Returns brand new object that has a bunch of blank grid squares 
    } 
    , "copyMap": function(map){ 
     //Returns new object with the same value as parameter map 
    } 
    , "newBoard": function(svg,width,height,ioPlugs,map){ 
     //Returns new object with a target svg, 
     //either a blank map or a copy of the given map, 
     //a set of ioPlugs, 
     //the electric current set up, 
     //etc. 
     //Initializes a few other things 
    } 
    // and other functions of course... 
} 

: 나는 한 페이지에 내 켈트 매듭 발생기 및 회로 게임이 있다면, 내가 KNOT.drawCIRCUIT_BOARD.draw)

그래서있을 것입니다, 여기에 내 현재 세트까지의 짧은 버전입니다 하나의 변수에 모든 함수가있는 것을 제거하십시오. 한 페이지에 여러 게임을 넣을 수있는 유연성이 필요합니다. 나는 올바르게 생성자를 만드는 것은 키워드를 사용하는 것을 포함한다는 것을 읽었다. 그러나 이러한 생성자에 대해 this을 사용하려고 할 때마다 예를 들어 모든 단일 gridSquare에 연결된 모든 기능이있는 수많은 기능이있는지도가 표시됩니다.

그래서 질문은 어떻게 여러 개체 생성자를 다른 개체의 모든 속성 인 인스턴스가 아닌 함수로 만들 수 있습니까? 그 응축 된 질문이 적절하게 말로 표현되어 있는지 나는 모른다.

+2

'new CIRCUIT_BOARD.someFunction()'을 호출하면 해당 호출 내에서'this'의 값이 새로운 객체가됩니다. 호출 앞에서'new'를 사용하지 않으면'this'의 값은'CIRCUIT_BOARD' 객체 자체가됩니다. – Pointy

+0

그래서 "blankMap"함수 안에서'new CIRCUIT_BOARD.blankGridSquare'를 사용하면, 여분의 함수없이 의도 된 빈 사각형 만 줄 것입니다. ... 지금 테스트 중 ... – RoboticRenaissance

+0

감사합니다. 그게 내가 필요한 것입니다. 다음 번에는 답안에 그런 정보를 넣어야합니다. 나는 그것을 시험하자마자 그것을 받아 들였을 것이다. – RoboticRenaissance

답변

2

이것은 모듈이 사용하는 정확한 패턴입니다. 예를 들어 :

export function FooCtor() { 
    this.stuff = 3; 
} 

이 될 것입니다 : 어떤 문제가 발생하지 않는 개체에 (단지 함수이다) 생성자를 포함

exports.FooCtor = FooCtor; 
function FooCtor() { 
    this.stuff = 3; 
} 

.

실행중인 혼동, as Pointy mentionednew 연산자가 수행하는 함수 호출 내에서 this입니다. 합리적으로 생성자로 작동 할 수있는 함수에 대해 new을 호출하는 경우 런타임은 this에 할당 된 거의 비어 있지 않은 객체와 함께 새 컨텍스트를 구성하고 그와 함께 함수를 호출합니다. 그것은 일을 달리 전혀 아니다 : 을 알아 내기 위해

newInstance = FooCtor.call({}, ...args) 

사양을 통해 작업을하는 이유 일어나는 : 사양의 §12.3.3합니다 (new 연산자)를 시작으로

, 그것은 말한다 :

회원 표현 : 신규회원 표현개 인수

  1. 반환 EvaluateNew (MemberExpression, 인수).

    심판constructProduction을 평가 한 결과하자 :

EvaluateNew 3-4 말할 단계들 §12.3.3.1.1, 우리를 이끈다. 생성자을 GetValue (ref)로 설정하십시오. 속성 접근의 체인을 통해 아래로 그것의 방법을 작동합니다

(foo.bar, foo[bar], 무엇이든). 다음으로, 동일한 섹션의 9 단계는 말합니다 :

반환 구조 (생성자,아글리스트).

선도로 §7.3.13 및 건설 과정의 내부 동작. NEWTARGET이 경과되지 않은

경우, 이 NEWTARGET F하자 : 9 EvaluateNew의 단계

참고 Construct에서 1 단계를 트리거 ConstructnewTarget 매개 변수를 지정하지 않습니다 . §9.2.2에 정의 된 생성자의 [[Construct]] 재산, 오프

5 단계 Construct의 손을 실행. 단계 8 주 :

종류 경우 "기본", OrdinaryCallBindThis을 수행 할 것이다 (F, calleeContext, thisArgument).

그래서 우리는 5.A에 thisArgument의 정의에 되감기 :

thisArgument이 OrdinaryCreateFromConstructor (NEWTARGET, "%의 ObjectPrototype %의")하자.

추상 작업 OrdinaryCreateFromConstructor은 일반 객체를 [[작성 실제로 (마지막으로) 새로운 개체를 만드는 방법에 대한 간다 §9.1.14에 우리를 반사

생성자에 대한 컨텍스트로 사용되는 Prototype]] 값은 생성자의 프로토 타입 속성 (있는 경우)에서 검색됩니다. 그렇지 않으면 intrinsicDefaultProto라는 이름의 내장 함수가 [[Prototype]]에 사용됩니다.

이 시점에서 우리는 생성자 함수에 액세스 한 방법으로부터 몇 마일 떨어져 있습니다. new은 생성자로서 의미가있는 함수를 얻는 한 상관하지 않습니다. 합리적인 기능을 부여했다면이 체인은 새로운 객체를 설정하고 모든 프로토 타입 연결 항목을 처리합니다.

+0

어, 이것은 다소 혼란 스럽다. 그러나 'new' 키워드가 함수 내에서'this' 키워드의 참조를 변경한다는 점이 무엇입니까? 컨텍스트에서 함수를 제거하고 새로운 컨텍스트를 제공합니까? 그게 뭔가? 몇 년 동안 MDN에서 w3schools를 사용한 이유가 있습니다 ... – RoboticRenaissance

+0

스펙을 파고 들어가기 전에 요약본을 조금 추가했습니다. 스펙은 따르기가 어려울 수 있지만, 코드처럼 읽으면 많은 의미를 갖기 시작합니다. 또한, * please * w3schools를 사용하지 마십시오; 그들은 사실상 틀린 경향이 있고 그들의 예는 많은 문제를 가지고 있습니다. – ssube

+0

나는 좀 더 복잡한 정보가 부족하다는 것을 알게되었다. SVG로 만들 수있는 모든 것을 찾고 싶다면 MDN을 대신 사용할 것입니다. 다양한 언어와 자료에 대한 소개가됩니다. 나는 그곳에서 뻔뻔스럽게 뭔가 잘못된 것을 본 적이 한 번도 없었다. 그러나 새로운 청중이 실제로보다 정확한 사이트에서 오해한다는 오해가 곧바로 잘못된 대답보다 많은 문제를 야기합니다. 적어도, 어렸을 때의 경험이었습니다. 실제로 JQuery API 및 MDN 자료를 읽을 수 있으므로 선호합니다. – RoboticRenaissance