gpt4 book ai didi

javascript - 使对象子原型(prototype)具有父对象的上下文

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

这可能是重复的,如果是这样,我深表歉意。我浏览了几个问题,但没有找到一个完全符合我的情况的问题(这可能从一开始就是一个坏兆头)。

我有一个类,例如RandomClass,其定义如下

function RandomClass(id){
this._id = id;
}

RandomClass.prototype.getID = function(){
return this._id;
}

var rc = new RandomClass(1);
rc.getID(); //returns 1, as expected

假设我想定义一组处理程序,并将它们保存在 RandomClass 的子对象中(同时继续使用原型(prototype))。 我对原型(prototype)的了解有些有限,所以如果接下来的形式非常糟糕,我深表歉意。

RandomClass.prototype.handlers = {};

RandomClass.prototype.handlers.HandlerOne = function(){
console.log("Handler one calling from ID: "+this._id);
//the context is not the context of RandomClass, but of RandomClass.prototype.handlers!
}

rc.handlers.HandlerOne(); //prints "Handler one calling from ID: unknown"

同样,也许这是不好的形式,但我有几个需要调用的处理程序,并且以这种方式执行操作可以将代码简化为:

var handler = "one of many many handlers returned from an ajax request";
rc.handlers[handler]();

所以,我的问题是如何使 HandlerOne 的上下文成为 RandomClass 而不是处理程序的上下文?我想继续使用原型(prototype),因为这样它们就不会被克隆多次(如下例所示):

function RandomClass(id){
this._id = id;
this._handlers = {};
}

function HandlerOne(){
console.log("Handler one calling from ID: "+this._id);
}

var rc = new RandomClass(1);
rc._handlers["HandlerOne"] = HandlerOne.bind(rc);
rc._handlers["HandlerOne"]() //prints as expected, but I believe performance is much worse here

最佳答案

可以满足您这样做,而不是绑定(bind)上下文尝试将其作为参数传递。

function RandomClass(id){
this._id = id;
this._handlers = {};
}

function HandlerOne(instance){
var parentScope = instance;

console.log("Handler one calling from ID: "+parentScope._id);
}

//call it like this
var rc = new RandomClass(1);
rc._handlers["HandlerOne"] = HandlerOne;
rc._handlers["HandlerOne"](rc)

关于javascript - 使对象子原型(prototype)具有父对象的上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26047655/

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