2010-05-03 4 views
1

나는 자바 스크립트로 수업을 시작했고 벽에 부딪쳤다. 클래스 (대개 Animal)를 작성한 다음 클래스를 확장하고 메소드 (예 : 개 경고 ('Bark');)를 수행하는 방법보다 간단한 튜토리얼을 살펴 보았습니다.어떻게 자바 스크립트에서 클래스를 동적으로 인스턴스화합니까?

사용자가 인스턴스화 할 수있게하려는 클래스를 만들었습니다 (올바른 단어입니까?). 예를 들어, 내 프로그램의 첫 단계는 사용자가 클래스에 이름을 부여한 다음 클래스의 다양한 변수를 채우기 시작하는 것입니다. 그들이 그것을했을 때 그들은 여러 번 다시 그것을 할지도 모른다.

편집 코드의 FULL 예 :

function Blind() { 
    this.Type = null; 
    this.Colour = null; 
    this.Width = 500; 
    this.Drop = 500; 
    this.Price = 0; 
} 

function BlindAluminium() { 
    Blind.call(this); 
    this.Type = 'aluminium'; 
    this.SubType = null; 
    this.StackHeight = 0; 
} 

객체를 정의하는 코드 즉. 의사 코드에서, 내가 만든 될 새로운 객체를 필요로 제출에

<form id="create_blind_form" name="create_blind_form" method="post" action=""> 
    <label for="blind_name">Blind Name: <input name="blind_name" id="blind_name" type="text" /></label> 
    <input name="submit" type="submit" value="Submit" /> 
</form> 

, 이런 식으로 뭔가 :

다음

는 사용자가 새로운 객체를 정의 할 수 있도록 할 HTML입니다 그런 다음
var *blind_name_from_the_form* = new BlindAluminium(); 

후에 나는 이런 식으로 행동 할 희망 :

*blind_name_from_the_form*.subType = '50mm'; 
+0

실제로 코드 줄이 무엇인지 알지 못합니다. 클래스 이름이 객체입니까? – Matchu

+0

귀하의 질문에 이해가되지 않습니다.자바 스크립트에는 클래스가 없으므로 동적인지 여부에 관계없이 인스턴스를 생성 할 수 없습니다. –

+0

답변을 주셔서 감사합니다. 이전에 좋지 않은 예제에 대한 사과를하고 싶습니다. – Adam

답변

3

다른 개체에 이름을 저장하면 될까요?

var instances = {}; 
instances['theNameTheUserChose'] = new MyObject(); 
+0

이것은 제가 취한 접근법이 아닙니다. 이 코드 예제를 사용했습니다 : function BlindCart() { this.Blinds = new Array (arguments.length); for (i = 0; i Adam

4

짧은 대답은 당신이려고하고 있다는 것입니다 eval을 사용해야합니다. 런타임에만 알려진 이름으로 함수 (또는 클래스)를 호출하려는 경우에는 그 주위에 방법이 없습니다.

eval("var className = new MyObject();"); 

그렇다면 몇 가지 대안을 고려해 볼 수 있습니다. 사람들은 평판이 나쁜 이유에 대해 여러 가지 이유를 제시 할 것입니다. 하지만 나에게이 길로 내려가는 것은 관리하기가 어색 할뿐입니다. 네, Crockford를 파보세요.

어색한 클래스를 사용하는 대신 Javascript의 프로토 타입 상속을 사용할 수 있습니까? 자바 클래스에는 클래스가 없다는 것을 감안할 때 실제로 문제가 발생하지 않는다면 클래스를 사용할 이유가 없습니다.

+0

분명히 그것은 사실 일 수 없습니다. 어때?'function a() {return 'foo'} this [ 'a']()'? Google 크롬 콘솔에서 예상대로 "foo"로 평가합니다. 그러나 원래 질문이 무엇을 요구하는지 이해하는 데에도 여전히 어려움이 있습니다. – Matchu

+0

@Matchu : 문자열의 함수 호출은 'eval'을 사용하지 않아도'어색함 '또는 잘못된 사용으로 간주 될 수 있습니다. 그러나 나는 당신이 eval이 필요하다는 주장을 반박하는 것을 이해한다. –

+0

+1 "자바 클래스에는 클래스가 없다는 것을 감안할 때 문제에 맞지 않는 경우 클래스를 사용하지 않아도됩니다. 문제가 해결되지 않으면 사용할 수 없습니다." 나는 고전적인 oo 패턴으로 자바 스크립트를 강제로 많이 사용하지 않습니다. http://www.crockford.com/javascript/inheritance.html, 특히 마지막 (추가 된) 행을 읽으십시오. – KooiInc

1

항상 유형에 대한 참조가 있어야합니다. 당신이 생성자 함수 (클래스)를 생성하고 그것을 MyObject라고 부르 자. 이 프로그래밍이다

var userObject = new SomethingElse(); // instead of new MyObject(); 

, 그래서 당신은 항상 명시 적으로해야 할 것 : 내가 제대로 이해하면 사용 사례는 사용자가이 대신 같은 것을 할 수 있어야한다는 것입니다. 당신이 뭔가를 할 수 있습니다 : 당신이 위와 같이 할 경우에도 사용자가 "유형"개체의 "ATYPE"속성에 포함 된 내용을 알고해야 할 것

var types = {}; 
types["aType"] = MyObject; 
var userObject = new types["aType"]; 

참고. 다음과 같이 할 수는 없습니다.

var userObject = guessTheClassName(); 

희망이 있습니다.

+0

새 예제가 더 나은 설명이되기를 바랍니다. 사용자가 제공 한 대답이 알 수없는 부분이 = 기호의 다른 면인 문제를 해결한다고 생각합니다. – Adam

관련 문제