상속시 예상대로 해결되지 않는 프로토 타입 메서드 내부의 'this'

R01010010

node.js에 모듈 ( https://github.com/fluxxu/evalidator ) 의 확장 인 생성자가 있습니다. 이 확장 생성자는 프로토 타입에 두 가지 추가 메서드를 정의하고 ** 메서드 B 는 'this'키워드를 통해 메서드 A를 호출합니다 **. 이 생성자는 다른 객체의 속성을 초기화하는 데 사용되며이 속성에서 메서드 B를 호출하면 'main object'에 메서드 A가없는 것과 같은 오류가 발생합니다.

TypeError: Object function (){ superEvalidatorVar.method_B(); } 
has no method 'method_B' at Object.<anonymous> 

다음은 코드입니다.

var EValidator = require('evalidator');


/**
 * EValidator extension object
 * @constructor
 */
function SuperEValidator(){
    // EValidator Inheritance
    EValidator.apply(this, arguments);
}

SuperEValidator.prototype = Object.create(EValidator.prototype);
SuperEValidator.prototype.constructor = SuperEValidator;

SuperEValidator.prototype.method_A = function(){
    console.log('method_A called');
};

SuperEValidator.prototype.method_B = function(){
    this.method_A();
};

var superEvalidatorVar = new SuperEValidator();

var mainObject = {
    callingSuperEValidator: function(){
        superEvalidatorVar.method_B();
    }
};

/*** Calling methods from MainObject ***/
mainObject.callingSuperEValidator.method_B(); // Throws Error!

** 확장 생성자의 method_B에있는 'this'키워드는 mainObject로 확인됩니다. 이유는 무엇입니까?

  1. var me를 설정하십시오. 전역 수준에서 PropertyObject 생성자에서 'this'로 설정 한 다음 method_B ​​내부에서 'this'대신 'me'를 사용합니다.
  2. method_B ​​내부에서 'this'대신 'PropertyObject.prototype'을 사용하십시오.

하지만 뭔가 나쁜 일이 있는지 궁금합니다 SuperEValidator에서이 동작을 이해하지 못합니다

편집하다:

이 모든 것의 진짜 목적은 Mongoose Schema의 'validate'메소드를 다시 작성하는 것입니다.

PostSchema.methods.validate = function(cb){

    // 'this' will have the value of the object (model) from which the function will be called
    evPost.validate_super(this, cb);

};
hjl

문제로 인해 아닌 this, this정확히 EV 준수합니다.

문제는 EV와 처음으로 만드는 것입니다 ev.__proto__==={}후 재 할당 SuperEValidator.prototype에서 연결을 해제하는 ev.__proto__SuperEvalidator.prototype.

여기서 SuperEValidator에 대한 함수 선언은 호이 스팅이지만 프로토 타입 정의에는 적용되지 않습니다. 문제를 해결하려면 mainObject를 맨 아래로 이동하기 만하면됩니다.

var mainObject = {
    propertyObject: new PropertyObject(),
    ev: new SuperEValidator() // at the moment, ev.__proto__ === {}
};
...
// SuperEValidator.prototype has been assigned to another reference while ev.__proto__ is still {}
SuperEValidator.prototype = Object.create(EValidator.prototype); 

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

지속되는 객체 간의 MongoDB 프로토 타입 상속

분류에서Dev

주어진 코드에 대해 객체 프로토 타입 속성이 무시되지 않는 이유

분류에서Dev

일부 메서드는 프로토 타입에 있지만 Object.assign을 통해 전달되지 않는 반면 다른 메서드는

분류에서Dev

프로토 타입이 예상대로 작동하지 않습니다.

분류에서Dev

javascript-프로토 타입 내부에 정의되지 않음

분류에서Dev

자바 스크립트 프로토 타입 상속이 예상 된 메서드를 호출하지 않습니다.

분류에서Dev

프로토 타입 메서드가 호출되지 않음

분류에서Dev

Q 예상대로 해결되지 않는 약속

분류에서Dev

상속되지 않은 JS 프로토 타입 객체?

분류에서Dev

이 낙타 sftp 경로에서 내 속성이 해결되지 않는 이유는 무엇입니까?

분류에서Dev

함수를 상속하지 않는 자바 스크립트 프로토 타입 ... 또는 프로토 타입?

분류에서Dev

`this`는 프로토 타입 메서드에 바인딩되지 않습니다.

분류에서Dev

메서드 내에서 JavaScript 프로토 타입에서 상속 된 메서드를 참조 할 수없는 이유

분류에서Dev

`UItableViewCell` 내부의`UIImage`로드가 예상대로 작동하지 않습니다.

분류에서Dev

프로토 타입 메서드에서 "this"가 항상 객체 자체의 프로토 타입을 참조하는 것은 아닙니다.

분류에서Dev

메서드 재정의가 예상대로 표현되지 않습니다.

분류에서Dev

Typescript 4 : 프로토 타입 메서드의 임시 재정의

분류에서Dev

프로토 타입을 사용하여 다른 생성자에서 상속하는 것과 상속하는 생성자 내부에서 apply 메소드를 사용하는 것의 차이점

분류에서Dev

예상대로 작동하지 않는 낙타 메시지 재전송

분류에서Dev

메서드가 부모의 프로토 타입에 속하지 않을 때 자식에서 부모의 메서드를 호출하는 방법이 있습니까?

분류에서Dev

프로토 타입에있는 속성의 set 및 get 메서드는 set-get 메서드가없는 인스턴스의 해당 속성에서 가려지지 않습니다.

분류에서Dev

생성자에서 초기화 된 JavaScript 프로토 타입 속성이 할당 된 새 프로토 타입으로 재정의되지 않습니다.

분류에서Dev

템플릿 클래스의 명시 적 메서드 특수화가 클래스 내부의 프로토 타입 선언없이 작동하는 이유

분류에서Dev

JS의 프로토 타입 상속

분류에서Dev

프로토 타입 상속-프로토 타입 속성 내에서 소품에 액세스

분류에서Dev

상태를 유지하면서 프로토 타입 메서드 호출

분류에서Dev

setInterval 내부의 setState가 예상대로 작동하지 않습니다. 이유는 무엇입니까?

분류에서Dev

프로토 타입 속성에 할당하면 프로토 타입에서 재정의해야하지 않습니까?

분류에서Dev

여기서 프로토 타입 메서드가 무시되는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    지속되는 객체 간의 MongoDB 프로토 타입 상속

  2. 2

    주어진 코드에 대해 객체 프로토 타입 속성이 무시되지 않는 이유

  3. 3

    일부 메서드는 프로토 타입에 있지만 Object.assign을 통해 전달되지 않는 반면 다른 메서드는

  4. 4

    프로토 타입이 예상대로 작동하지 않습니다.

  5. 5

    javascript-프로토 타입 내부에 정의되지 않음

  6. 6

    자바 스크립트 프로토 타입 상속이 예상 된 메서드를 호출하지 않습니다.

  7. 7

    프로토 타입 메서드가 호출되지 않음

  8. 8

    Q 예상대로 해결되지 않는 약속

  9. 9

    상속되지 않은 JS 프로토 타입 객체?

  10. 10

    이 낙타 sftp 경로에서 내 속성이 해결되지 않는 이유는 무엇입니까?

  11. 11

    함수를 상속하지 않는 자바 스크립트 프로토 타입 ... 또는 프로토 타입?

  12. 12

    `this`는 프로토 타입 메서드에 바인딩되지 않습니다.

  13. 13

    메서드 내에서 JavaScript 프로토 타입에서 상속 된 메서드를 참조 할 수없는 이유

  14. 14

    `UItableViewCell` 내부의`UIImage`로드가 예상대로 작동하지 않습니다.

  15. 15

    프로토 타입 메서드에서 "this"가 항상 객체 자체의 프로토 타입을 참조하는 것은 아닙니다.

  16. 16

    메서드 재정의가 예상대로 표현되지 않습니다.

  17. 17

    Typescript 4 : 프로토 타입 메서드의 임시 재정의

  18. 18

    프로토 타입을 사용하여 다른 생성자에서 상속하는 것과 상속하는 생성자 내부에서 apply 메소드를 사용하는 것의 차이점

  19. 19

    예상대로 작동하지 않는 낙타 메시지 재전송

  20. 20

    메서드가 부모의 프로토 타입에 속하지 않을 때 자식에서 부모의 메서드를 호출하는 방법이 있습니까?

  21. 21

    프로토 타입에있는 속성의 set 및 get 메서드는 set-get 메서드가없는 인스턴스의 해당 속성에서 가려지지 않습니다.

  22. 22

    생성자에서 초기화 된 JavaScript 프로토 타입 속성이 할당 된 새 프로토 타입으로 재정의되지 않습니다.

  23. 23

    템플릿 클래스의 명시 적 메서드 특수화가 클래스 내부의 프로토 타입 선언없이 작동하는 이유

  24. 24

    JS의 프로토 타입 상속

  25. 25

    프로토 타입 상속-프로토 타입 속성 내에서 소품에 액세스

  26. 26

    상태를 유지하면서 프로토 타입 메서드 호출

  27. 27

    setInterval 내부의 setState가 예상대로 작동하지 않습니다. 이유는 무엇입니까?

  28. 28

    프로토 타입 속성에 할당하면 프로토 타입에서 재정의해야하지 않습니까?

  29. 29

    여기서 프로토 타입 메서드가 무시되는 이유는 무엇입니까?

뜨겁다태그

보관