2012-08-30 6 views
2

이 문장이 정확한지 알고 싶습니다.자바 스크립트에서 다른 객체의 인스턴스를 생성

당신은 할 수 있습니다 :

var a = new A(); 

의 경우에만 Ainstanceof Function입니다.

함수의 인스턴스를 만들면 함수가 객체라는 것을 알 수 있습니다. 다른 사용자 정의 객체의 인스턴스를 만들 수없는 이유는 무엇입니까?

var b={}; 
var c = new b(); //error 

편집이 :이처럼 있도록 어떻게 b을 변경할 수 있습니다 나는 그의 인스턴스를 만들 수 있습니까?

+0

당신은'A = {} 선언하는 경우는, 의미, 예를 들어,'? – Andre

+0

인스턴스는 "생성자"또는 객체를 "생성"하는 작업 단위에서 "생성"되어야하므로 "생성자"의 문자 적 ​​의미에서 - 따라서 함수 "가되어야합니다. –

답변

4

실제로 Object.create()을 사용하면 ECMAscript의 프로토 타입 특성을 살릴 수 있습니다. 마찬가지로

var b = { }; 
var c = Object.create(b); 

이제 C는 프로토 타입 체인에 b을 갖습니다. ECMAscript 또는보다 정확하게 프로토 타입 상속은 "고전 상속"과 완전히 똑같은 방식으로 작동하지 않습니다. 함수를 호출 할 때 new을 호출하면 새로 생성 된 객체도 실제로 수신됩니다. 해당 개체를 수정하고 액세스 할 수 있습니다. 생성자 함수이라고하는 값 내의 this 값을 사용합니다.

그러나 지금까지 아무 것도 상속하지 않았습니다. 인스턴스를 만들기 전에 생성자 함수에 대한 .prototype - 개체를 만들고 채워야합니다. 이 패턴은 많은 사람들을 화나게 했으므로 ES5는 Object.create()을 사용하여 다른 객체를 직접 상속하는보다 편리한 방법으로 가져 왔습니다.

1

또한

var b = new a.constructor(); 
3

짧은 대답을 수행 할 수 있습니다 new 운영자가 일반 객체가하지 않아도 특별한 내부 방법 [[Construct]]을 가지고 피연산자가 필요합니다.

긴 대답 :

11.2.2 The new Operator 
The production NewExpression : new NewExpression is evaluated as follows: 
    1. Evaluate NewExpression. 
    2. Call GetValue(Result(1)). 
    3. If Type(Result(2)) is not Object, throw a TypeError exception. 
    4. If Result(2) does not implement the internal [[Construct]] method, throw a TypeError exception. 
    5. Call the [[Construct]] method on Result(2), providing no arguments (that is, an empty list of arguments). 
    6. Return Result(5). 

    The production MemberExpression : new MemberExpression Arguments is evaluated as follows: 

    1. Evaluate MemberExpression. 
    2. Call GetValue(Result(1)). 
    3. Evaluate Arguments, producing an internal list of argument values (11.2.4). 
    4. If Type(Result(2)) is not Object, throw a TypeError exception. 
    5. If Result(2) does not implement the internal [[Construct]] method, throw a TypeError exception. 
    6. Call the [[Construct]] method on Result(2), providing the list Result(3) as the argument values. 
    7. Return Result(6). 
+0

어떻게 할 수 있습니까? 나는 그것의 인스턴스를 만들 수 있도록'b'를 바꿉니 까? –

+0

당신/정말로 /하려고하는 것이 무엇입니까? 왜 너는 그런 짐승을 만들려고하니? –

3

는 단순히 기능의 인스턴스를 만들 수 있습니다 당신은 함수가 객체 알고있다. 다른 사용자 정의 객체의 인스턴스를 만들 수없는 이유는 무엇입니까?

"기능의 인스턴스를 만들 수 있습니다."라고 말하는 것은 정확하지 않습니다. new 키워드는 오해의 소지가 있습니다. 실제로는 그렇지 않을 때 클래스를 사용하여 객체 지향을 구현하는 것처럼 보입니다.

new A()으로 실제로하고있는 일은 생성자 함수 A을 사용하여 개체를 생성하는 것입니다. new 키워드는 A에서 객체를 반환하는 JavaScript 인터프리터 - 특히 this으로 참조되는 객체를 A으로 반환하도록 지시합니다.

편집 : b을 어떻게 변경하여 인스턴스를 만들 수 있습니까?

예에서 b은 개체 (var b={};)입니다. b을 생성자 함수로 변경하면이를 사용하여 객체를 만들 수 있습니다. (규칙에 따라 자바 스크립트에서 생성자 함수는 대문자로 시작합니다.) 그래서

:에

function B() { 
} 

var c = new B(); 

당신은 Bprototype 객체에 일을 추가 할 수 있습니다, 그들은 너무 c에 액세스 할 수 있습니다 (그리고 당신이 B을 사용하여 만든 다른 개체) :

function B() { 
} 

B.prototype.NAME = 'B'; 

B.prototype.hello = function() { 
    alert('Hello!'); 
} 

var c = new B(); 
c.NAME // 'B' 
c.hello() // alerts 'Hello!' 
관련 문제