js MDN에 Function 정보를 제공합니다.prototype.bind 호환 오래된 브라우저 함수 수정 제안

2686 단어

DN 원본

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
      Function.prototype.bind = function (oThis) {
      if (typeof this !== "function") {
        // closest thing possible to the ECMAScript 5
        // internal IsCallable function
        throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")
      }

      var aArgs = Array.prototype.slice.call(arguments, 1), 
          fToBind = this, 
          fNOP = function () {},
          fBound = function () {
            
            return fToBind.apply(this instanceof fNOP
                                   ? this
                                   : oThis || this,
                                 aArgs.concat(Array.prototype.slice.call(arguments)))
          }
        fNOP.prototype = this.prototype
        fBound.prototype = new fNOP()

      return fBound
    }
}

수정 버전 제시

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5
      // internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable")
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
      fToBind = this, 
      fNOP = function () {},
      fBound = function () {
        fBound.prototype = this instanceof fNOP ? new fNOP() : fBound.prototype
        return fToBind.apply(this instanceof fNOP
                                 ? this
                                 : oThis || this,
                                 aArgs.concat(Array.prototype.slice.call(arguments)))
        }
    if( this.prototype ) {
      // Function.prototype doesn't have a prototype property
      fNOP.prototype = this.prototype
    }

    return fBound
  }
}

제시된 수정점은


첫 번째 곳
fNOP.prototype = this.prototype 
            ⇩⇩⇩ 
if( this.prototype ) {
   // Function.prototype doesn't have a prototype property
   fNOP.prototype = this.prototype
}

함수 Function 때문에 수정되었습니다.프로토타입은 프로토타입 원형이 없어요.
ps: 어떤 사람들은 Function을 이상할 수 있습니다.프로토 타입은 대상이 아닌가요?왜 함수가 바뀌었어, 안 믿으면 콘솔에 가서 출력해 봐.
두 번째 곳
fBound.prototype = new fNOP()
            ⇩⇩⇩ 
fBound.prototype = this instanceof fNOP ? new fNOP() : fBound.prototype

원생bind 함수는 new 키워드를 사용하지 않았을 때 원시 함수인prototype이 드러나지 않기 때문에 수정되었습니다.
그래서 우리는 여기서 원형 계승을 진행할 때 함수가 실행되기 시작할 때 하고 함수 내부에서 판단하며 new 키워드를 사용한다면 계승하고 그렇지 않으면prototype을 노출하지 않는다
MDN Function.protype.bind 링크

좋은 웹페이지 즐겨찾기