gpt4 book ai didi

javascript - 继承时原型(prototype)方法中的“this”未按预期解析

转载 作者:行者123 更新时间:2023-12-02 16:39:13 25 4
gpt4 key购买 nike

我有一个构造函数,它是 node.js 中模块 ( https://github.com/fluxxu/evalidator ) 的扩展。 这个扩展构造函数在原型(prototype)中定义了另外两个方法,**方法 B 通过“this”关键字调用方法 A**。此构造函数用于初始化另一个对象中的属性,当我从此属性调用方法 B 时,我收到一条错误,如“主对象”没有方法 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. 设置变量我;在全局级别并在 PropertyObject 构造函数中将其设置为“this”,然后在 method_B 内部使用“me”而不是“this”。
  2. 在 method_B 内部使用“PropertyObject.prototype”而不是“this”

但我想知道是否发生了一些不好的事情,我不明白 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);

};

最佳答案

问题不是由于 this 引起的,this 完全遵循 ev。

问题是您首先使用 ev.__proto__==={} 创建 ev,然后重新分配 SuperEValidator.prototype,这会破坏 ev.__proto__ 的链接SuperEvalidator.prototype

请注意,这里 SuperEValidator 的函数声明是提升,但原型(prototype)定义不是。所以只需将 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);

关于javascript - 继承时原型(prototype)方法中的“this”未按预期解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27643829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com