>웹 프론트엔드 >JS 튜토리얼 >프로토타입 메서드를 생성자 함수 외부에서 정의해야 하는 이유는 무엇입니까?

프로토타입 메서드를 생성자 함수 외부에서 정의해야 하는 이유는 무엇입니까?

DDD
DDD원래의
2024-10-30 21:14:02693검색

Why Should Prototype Methods Be Defined Outside the Constructor Function?

생성자 함수 내에서 프로토타입 메서드 할당: 잠재적 위험

스타일리시하게 일부에서는 프로토타입 메서드 정의를 위해 다음 구조를 선호합니다.

var Filter = function( category, value ){
  this.category = category;
  this.value = value;

  // product is a JSON object
  Filter.prototype.checkProduct = function( product ){
    // run some checks
    return is_match;
  }
};

그러나 이 접근 방식은 대체 구조에 비해 몇 가지 단점이 있습니다.

var Filter = function( category, value ){
  this.category = category;
  this.value = value;
};// var Filter = function(){...}

Filter.prototype.checkProduct = function( product ){
  // run some checks
  return is_match;
}

기능적 단점:

  1. 중복적이고 비효율적인 할당: 프로토타입 메서드는 여러 번 할당되므로 불필요하며 성능에 영향을 미칠 수 있습니다.
  2. 범위 문제: 프로토타입 메서드 내에서 생성자의 지역 변수를 참조하면 다음과 같은 문제가 발생할 수 있습니다. 예상치 못한 결과를 초래합니다. 예:
var Counter = function(initialValue){
  var value = initialValue;

  // product is a JSON object
  Counter.prototype.get = function() {
      return value++;
  }
};

var c1 = new Counter(0);
var c2 = new Counter(10);
console.log(c1.get());    // outputs 10, should output 0

이 시나리오에서 get()은 c1 대신 c2의 지역 변수 값을 반환합니다. 왜냐하면 메서드 클로저가 프로토타입에서 가장 최근에 정의된 값을 참조하기 때문입니다.

기타 고려 사항:

  • 생성자 외부 프로토타입: 첫 번째 구조는 생성자 외부 프로토타입에 액세스하는 것을 금지하여 잠재적으로 유연성을 제한합니다.
  • 메서드 배치: 두 번째 구조에서는 프로토타입이 아닌 객체에 직접 메소드를 배치하므로 경우에 따라 성능이 향상될 수 있습니다.

결론 :

첫 번째 구조는 스타일적으로는 만족스러울 수 있지만 기능적 단점과 범위 문제가 발생할 수 있습니다. 잠재적인 문제를 피하기 위해 일반적으로 생성자 함수 외부(두 번째 구조에서와 같이) 프로토타입 메서드를 할당하는 것이 좋습니다.

위 내용은 프로토타입 메서드를 생성자 함수 외부에서 정의해야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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