>  기사  >  웹 프론트엔드  >  JavaScript에서 `new` 연산자는 어떻게 작동하며, 프로토타입 체인을 사용하여 객체를 어떻게 생성합니까?

JavaScript에서 `new` 연산자는 어떻게 작동하며, 프로토타입 체인을 사용하여 객체를 어떻게 생성합니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-27 21:28:30194검색

How does the `new` operator work in JavaScript, and how does it create objects with their prototype chains?

JavaScript에서 new 연산자는 어떻게 작동하나요?

new 연산자는 JavaScript의 객체 지향 프로그래밍 시스템에서 중추적인 역할을 합니다. 객체를 효과적으로 생성하고 관리하려면 해당 기능을 이해하는 것이 중요합니다.

새 연산자 구현 살펴보기

<code class="javascript">new dataObj(args);</code>

이 코드 조각은 내부 [[ Construct]] 일련의 특정 작업을 수행하는 메서드:

  1. 객체 생성: 새로운 기본 객체를 초기화합니다.
  2. 프로토타입 체인 구축 : 이 객체의 내부 [[Prototype]]은 Function 프로토타입 속성을 가리키도록 설정되어 있습니다. 특히 함수 프로토타입 속성이 객체(Number, String, Boolean, Undefine 또는 Null과 같은 기본 값)가 아닌 경우 Object.prototype이 대신 프로토타입으로 사용됩니다.
  3. 함수 호출: 객체가 생성된 후 함수는 새로 생성된 객체에 this 값이 할당되어 호출됩니다.
  4. 반환 값 처리: 호출된 함수의 반환 값이 기본 형식을 생성하는 경우 , 내부적으로 생성된 객체가 반환됩니다. 그러나 개체가 반환되면 내부에서 생성된 개체는 삭제됩니다.

명확성을 위한 대체 구현

이해력을 높이기 위해 다음은 다음과 같은 대체 표현입니다. new 연산자가 달성하는 것:

<code class="javascript">function NEW(f) {
  var obj, ret, proto;

  // Check if `f.prototype` is an object, not a primitive
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Create an object that inherits from `proto`
  obj = Object.create(proto);

  // Apply the function setting `obj` as the `this` value
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  if (Object(ret) === ret) { // the result is an object?
    return ret;
  }
  return obj;
}

// Example usage:
function Foo (arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
obj.prop; // 'bar'
obj.inherited; // 'baz'
obj instanceof Foo // true</code>

이 예에서:

  • NEW는 new 연산자의 동작을 시뮬레이션하는 사용자 정의 함수입니다.
  • 확인합니다. 함수 프로토타입 속성이 객체인 경우,否则使用 Object.prototype 来创建新对象。
  • NEW는 새로 생성된 객체에 함수를 this 값으로 적용합니다.
  • 함수의 반환 값에 따라 함수가 결정됩니다. 반환할 최종 객체입니다.

위 내용은 JavaScript에서 `new` 연산자는 어떻게 작동하며, 프로토타입 체인을 사용하여 객체를 어떻게 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.