gpt4 book ai didi

JavaScript 原型(prototype)绑定(bind)

转载 作者:行者123 更新时间:2023-11-28 02:53:17 25 4
gpt4 key购买 nike

我是基于原型(prototype)的语言的新手,并且已阅读此问题:

Preserving a reference to "this" in JavaScript prototype functions

我想知道使用基于原型(prototype)的签名将方法附加到对象有什么值(value)。为什么不直接将方法附加到对象定义中的对象属性呢?

其次,当使用原型(prototype)签名在对象上定义方法时,为什么“this”指针会解析为函数内的窗口对象?这似乎是一个设计缺陷。如果不是,有人可以解释一下,或者向我指出为什么不可以的解释吗?

谢谢。

编辑:

此代码按预期执行,呈现一个消息框,其中包含“此处”一词。

function Obj() {   
this.theVar = 'here';
this.method2 = function(){ alert( this.theVar ); }
}

Obj.prototype.method3 = function(){ this.method2(); }
Obj.prototype.method4 = function(){ this.method3(); }

var obj = new Obj();
obj.method4();

此代码是我的 AJAX 回调,“this”指针在执行期间引用“window”对象。

Test.prototype.nextCallback = function( response ) {
if( response.Status != 'SUCCESS' )
show_message( response.Message, false );
else
this.setQuestion( response.Question );
}

Test.prototype.setQuestion = function( question ){ ... }

“this”指针实际上在 AJAX 调用之前可以正常工作,但在 AJAX 调用之后就不行了。这个结果是因为在 AJAX 调用返回之后、调用回调之前没有正确恢复 nextCallback() 上下文吗?有办法解决这个问题吗?

最佳答案

1- 在构造函数原型(prototype)上添加成员的要点是行为重用。

从该原型(prototype)继承的所有对象实例都将能够通过原型(prototype)链解析成员,而且成员仅定义一次,而不是在每个实例中定义.

2- 发生这种情况是因为每个函数都有自己的执行上下文(即存储 this 值的位置),并且在调用函数时会隐式设置 this 值函数,如果函数引用没有基对象(例如foo();,vs obj.foo()),则全局对象将设置为调用方法内的 this 值。

参见this answer的第二部分了解更多详情。

编辑:查看代码后,似乎您正在传递 nextCallback 方法的引用作为某些 Ajax 成功事件的回调函数,如果是这样,则引用的基对象将丢失,一种常见的方法是使用正确调用您的方法的匿名函数,例如:

var obj = new Test();
//...
someAjaxLib(url, function (data) {
obj.nextCallback(data); // `this` will refer to obj within nextCallback
});

另一种方法是在构造函数中将方法绑定(bind)到其实例,请记住,该方法将被定义为您创建的每个对象实例的自己的属性,它不会被继承,例如:

function Test() {
var instance = this; // store reference to the current instance

this.nextCallback = function( response ) {
if( response.Status != 'SUCCESS' ) {
show_message( response.Message, false );
} else {
instance.setQuestion( response.Question ); // use the stored reference
}
}
}

关于JavaScript 原型(prototype)绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3294417/

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