두 가지 주요 차이점은 사용 방법에 있습니다. 그 이름에서 알 수 있듯이 생성자는 객체의 여러 인스턴스를 만들고 설정하도록 설계되었습니다. 반면에 객체 리터럴은 문자열 및 숫자 리터럴과 같이 일회성이며 구성 객체 또는 전역 단독 (예 : 네임 스페이스)으로 자주 사용됩니다.
은 첫 번째 예제에 대해 몇 가지 미묘한 차이가주의하는 것이 있습니다 코드가 실행되면
, 익명 함수가 생성되고 myObj
에 할당,하지만 아무것도 다른 일이 없습니다. methodOne
및 methodTwo
은 myObj
이 명시 적으로 호출 될 때까지 존재하지 않습니다. myObj
호출 방법에 따라
는 , 방법 methodOne
및 methodTwo
는 다른 장소에서 끝날 것이다 :
myObj()
: 어떤 컨텍스트가 제공되지 않기 때문에
이 window
에 this
기본값과 방법은 글로벌 될 것 .
var app1 = new myObj()
:
키워드로 인해 새 개체가 만들어져 기본 컨텍스트가됩니다. this
은 새 개체를 참조하며 메서드는 새 개체에 할당되고 이후에 app1
에 할당됩니다. 그러나 myObj.methodOne
은 정의되지 않은 상태로 유지됩니다.
myObj.call(yourApp)
:
이 내
myObj
를 호출하지만 또 다른 목적은,
yourApp
로 컨텍스트를 설정합니다. 메서드는
yourApp
에 할당되고
yourApp
의 모든 속성이 동일한 이름으로 재정의됩니다. 이것은 Javascript에서 다중 상속 또는 혼합을 허용하는 매우 유연한 방법입니다.
생성자는 함수가 클로저를 제공하지만 객체 리터럴은 다른 수준의 유연성을 허용합니다. 예를 methodOne 및 methodTwo 객체 (생성자 외부에서 액세스 할 수 없습니다)에 비공개 공통 변수 암호에 의존하는 경우,이 수행하여 아주 간단하게 달성 할 수있는 경우 :
var myObj = function(){
var variableOne = "ABCD1234";
this.methodOne = function(){
// Do something with variableOne
console.log(variableOne);
};
this.methodTwo = function(){
// Do something else with variableOne
};
};
myObj();
alert(variableOne); // undefined
alert(myObj.variableOne); // undefined
당신은 variableOne
노출 만들고 싶었다 경우 (공개)하면 다음과 같습니다.
var myObj = function(){
this.variableOne = "ABCD1234";
this.methodOne = function(){
// Do something with variableOne
console.log(this.variableOne);
};
this.methodTwo = function(){
// Do something else with variableOne
};
};
myObj();
alert(variableOne); // undefined
alert(myObj.variableOne); // ABCD1234
개체 리터럴 구문이 정의 된 이유는 무엇입니까 (http://es5.github.com/#x11.1.5)? 어떤 종류의 대답을 기대합니까? 'this'는 함수의 특별한 지역 변수이며 (new가있는 함수가 호출 될 때 새로운 객체를 가리 킵니다) 객체 리터럴은 함수가 아닙니다. –
하지만 특정 이유나 논리가 뒤에 있습니까? 아니면 구문 일입니까? – testndtv
논리가 아닙니다. * "이"는 함수 내에서 특별하고, 객체 리터럴은 함수가 아닙니다. "* 충분합니까? 내가 원한다면 리터럴 문법을 변경하여 'var obj = {this.foo :'bar '};와 같은 객체를 만들 수는 있지만 확실한 이점은 무엇입니까? 'this .'는이 경우 완전히 중복됩니다. 그러나 나는 언어를 고안하지 않았습니다. 어쩌면 당신은 질문 한 사람들에게 권위있는 대답을해야합니다. 또한 디자이너가 이런 식으로 생각하지 않았을 수도 있습니다. –