new operator

현재 번역은 완벽하지 않습니다. 한국어로 문서 번역에 동참해주세요.

new 연산자는 사용자 정의 객체 타입 또는 내장 객체 타입의 인스턴스를 생성한다.

Syntax

new constructor[([arguments])]

Parameters

constructor
객체 인스터스의 타입을 기술(명세)하는 함수 
arguments
constructor와 함께 호출될 값 목록

Description

사용자 정의 객체를 생성에는 두 단계가 필요하다:

  1. 함수를 작성하여 객체 타입을 정의한다.
  2. new 연산자로 객체의 인스턴스를 생성한다.

객체의 타입을 정의하기 위해,   객체의 이름과 속성을  명세하는  함수를 만든다. 객체는 그 자체가 또 다른 객체인 속성를 가질 수 있다. 아래의 예를 본다.

  An object can have a property that is itself another object. See the examples below.

코드 new Foo(...)가 실행될 때 다음과 같은 일이 발생한다:

  1. Foo.prototype을 상속하는 새로운 객체가 하나 생성된다.
  2.  명시된 인자 그리고 새롭게 생성된 객체에 바인드된 this와 함께 생성자 함수 Foo 가 호출된다. new Foo는 new Foo()와 동일한다. 즉 인자가 명시되지 않은 경우, 인자 없이  Foo가 호출된다.
  3. 생성자 함수에 의해 리턴된 객체는 전체 new호출 결과가 된다.  만약 생성자 함수가 명시적으로 객체를 리턴하지 않는 경우, 첫번째 단계에서 생성된 객체가 대신 사용된다.( 일반적으로 생성자는 값을 리턴하지 않는다. 그러나 일반적인 객체 생성을 재정의(override)하기 원한다면 그렇게 하도록 선택할 수 있다.)

이전에 정의된 객체에 속성을 항상 추가할 수 있다. 예를 들면, car1.color = "black" 구문은 color속성을 car1에 추가한다. 그리고 그 값을 "black" 할당한다. 그러나, 이것 이 다른 객체들에게는 전혀 영향을 주지 않는다.  동일한 타입의 모든 객체들에게 새로운 속성을 추가하려면, Car객체 타입의 정의에 이 속성을 추가해야한다.

Function.prototype 속성을 사용하여 이전에 정의된 객체 타입에 공유 속성을 추가할 수 있다. 이것은  객체 타입의 인스턴스 하나에만 적용되는 것이 아니라  이 함수로 생성하는 모든 객체와 공유하는 속성을 정의한다. 

다음의 코드는  car 타입의 모든 객체에 null값을 갖는 color 속성을 추가한다. 그리고 car1객체 인스턴스에서만 이 값을 문자열 "black"으로 덮어 쓴다.  더 많은 정보는  prototype을 본다.

function Car() {}
car1 = new Car();
 
console.log(car1.color);    // undefined
 
Car.prototype.color = null;
console.log(car1.color);    // null
 
car1.color = "black";
console.log(car1.color);   // black

객체 타입과 객체 인스턴스

cars를 위한 객체 타입을 생성하기 원한다고 가정해 보자. 이 객체 타입이 car로 불리기 원하고, make, model, 그리고 year 속성을 갖게 하고 싶다. 이렇게 하기 위해서 다음과 같은 함수를 작성할 것이다:

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}

이제 다음과 같이,  mycar로 불리는 객체를 생성할 수 있다:

var mycar = new Car("Eagle", "Talon TSi", 1993);

이 구문은 mycar 를 생성하고 명시한 값을 속성 값으로 설정한다. 그래서 mycar.make 의 값은 문자열 "Eagle"이고, mycar.year는 정수 1993 이며 나머지도 마찮가지이다.

new를 호출해서 얼마든지 car 객체를 생성할 수 있다. 예를 들면:

var kenscar = new Car("Nissan", "300ZX", 1992);

속성  그 자신이 다른 객체인 객체의 속성

person이라고 불리는 객체를 다음과 같이 정의한다고 가정해보자:

function Person(name, age, sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
}

그리고 다음과 같이 두 개의  person객체 인스턴스를 새롭게 생성한다:

var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");

그런 다음  owner 속성을 포함하는 car의 정의를 다시 쓸수 있다. 이 owner속성은 person객체를 취한다. 다음과 같다:

function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}

새로운 객체의 인스턴스를 생성하기 위해 다음과 같이 사용한다:

var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
var car2 = new Car("Nissan", "300ZX", 1992, ken);

새로운 객체를 생성할 때 문자열이나 숫자 값을 넘겨주는 대신에, 위의 구문은 owner를 위한 파라메터로 rand 와  ken 객체를 넘겨준다. car2의 owner name을 확인해 보기 위해서, 다음의 속성에 접근할 수 있다:

car2.owner.name

Specifications

Specification Status Comment
ECMAScript 2017 Draft (ECMA-262)
The definition of 'The new Operator' in that specification.
Draft  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'The new Operator' in that specification.
Standard  
ECMAScript 5.1 (ECMA-262)
The definition of 'The new Operator' in that specification.
Standard  
ECMAScript 3rd Edition (ECMA-262)
The definition of 'The new Operator' in that specification.
Standard  
ECMAScript 1st Edition (ECMA-262)
The definition of 'The new Operator' in that specification.
Standard Initial definition. Implemented in JavaScript 1.0.

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Yes) (Yes) (Yes) (Yes) (Yes)
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Yes) (Yes) (Yes) (Yes) (Yes) (Yes)

See also

문서 태그 및 공헌자

 이 페이지의 공헌자: daehyoung
 최종 변경: daehyoung,