2009-08-08 4 views
10

코드 1 :이 두 코드 샘플의 차이점은 무엇입니까?

var Something = { 
name: "Name", 
    sayHi: function(){ 
    alert(Something.name); 
    } 
} 

코드 2 :

function Something(){ 
    this.name = "Name"; 
} 

Something.prototype.sayHi = function(){ 
    alert(Something.name); 
} 

편집 : 그래서, 얘들 아, 당신은 두 번째가 더 의미? 아니면 "공식적인"것인가?

+0

이 또한 나를 위해 좋은 질문, 게시물에 대한 감사입니다. –

+0

편집에서 질문에 관해서는, 당신이하고 싶은 일에 달려 있습니다. 객체 복사본이 하나 뿐인 경우 첫 번째 구문으로 이동하십시오. 'Something'이 다른 언어에서'Class' 인 것처럼) 여러 복사본을 만들고 싶다면 두 번째 구문 (또는 실제로'sayHi'를 생성자 안에 정의한 편집 된 버전으로'this.sayHi = function() {...}', 이것이 표준입니다. –

답변

8

을해야 할 두 번째에있는 동안 당신이

Something.sayHi(); 

을 수행 할 수 있습니다

당신은 아마 말을 그 라인을 원했다 첫 번째 예제에서는 실제로 이미 객체 인스턴스 인 object literal을 선언합니다.

두 번째 예에서는 객체 인스턴스를 생성하기 위해 new 연산자와 함께 사용할 수있는 생성자 함수를 정의합니다.

개체 리터럴을 사용하여 개체의 새 인스턴스를 만들고 프로토 타입 상속을 수행 할 수도 있지만 Douglas Crockford도이 기술을 홍보합니다.

function object(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

이 도우미 기능은 매우 직관적이고 편리하게 사용할 수 있습니다

은 기본적으로 당신은 object 연산자를 할 수 있습니다.

그것은 기본적으로 새 개체 인스턴스가 생성 함수 내에서, 기존의 객체는 가 새 개체의 프로토 타입에을 체인이며, 그 반환 매개 변수로 객체를받을 수 있습니다.

그것은이처럼 사용할 수 있습니다 : 당신이 원하는대로

var oldObject = { 
    firstMethod: function() { alert('first'); }, 
    secondMethod: function() { alert('second'); }, 
}; 

var newObject = object(oldObject); 
newObject.thirdMethod = function() { alert('third'); }; 

var otherObject = object(newObject); 
otherObject.firstMethod(); 

당신은 이전에 정의 된 객체로부터 새로운 인스턴스를 만들고, 더 갈 수 있습니다.

권장 :

+0

'Object (Something)'을 사용하는 것은'new' 키워드를 사용하는 것과 같지 않습니다. 특히 첫 번째 경우에 속성을 변경하면 전역으로 변경됩니다. 예를 들어'Object (Something) .name = "new name"은 Something 자체를 위해 변경하는 반면, (new Something()) .name = "new name"은 해당 _instance_에 대해서만 변경합니다. –

+0

예, 죄송합니다.이 기사에 설명 된 '객체'연산자에 대해 생각하고있었습니다 ... http://javascript.crockford.com/prototypal.html – CMS

+0

@Sinan, 많이 편집 됨 ... 24 시간 후에 잤다 : -) ... – CMS

7

첫 번째 코드 스 니펫에서 Something은 간단한 개체이며 생성자가 아닙니다. 특히 다음과 같이 전화 할 수 없습니다.

var o = new Something(); 

이러한 개체 생성 형식은 싱글 톤에 적합합니다. 하나의 인스턴스 만 필요로하는 객체

두 번째 스 니펫에서 Something은 생성자이며 new 키워드를 사용할 수 있습니다.

편집 :

또한, 두 번째 코드에서, 당신은 this.name 반대로 Something.name을 사용하고 있기 때문에, 항상, "뭔가"이다 생성자 자신의 이름을 알려줍니다 당신이하지 않는 한 해당 속성을 Something.name = "Cool";과 같은 값으로 재정의하십시오.

alert(this.name); 
1

첫 번째 예에서 당신이 그것을 기본적으로

new Something().sayHi(); 
관련 문제