Javascript方法调度过程

Javascript Method Dispatch Process

本文关键字:过程 调度 方法 Javascript      更新时间:2023-09-26

有人能解释一下当调用一个方法来选择运行哪个函数时JavaScript所经历的过程吗?我能在网上找到的大多数资源都解释了如何使用JavaScript对象实现特定行为,但没有解释方法调度在JavaScript中如何工作的一般原理。

"方法调度"实际上只是属性查找,因为JavaScript中的"方法"只是通过对象属性使用的函数。(在我的博客上有更多关于这方面的信息:神话方法

当你写:

obj.prop

JavaScript引擎查看CCD_ 1对象以查看其是否具有名称为CCD_。如果是,则使用该属性的值。如果没有,引擎将查找obj的原型对象,以查看it是否具有该名称的属性。如果是,则使用它的值。如果不是,则查看对象的原型。冲洗,重复,直到用完原型对象。

在某些允许方法重载的语言中,没有任何类型的"方法签名"匹配。JavaScript没有方法重载。具有给定名称的对象只能有一个属性。

让我们看一个例子:

function Thing() {
}
Thing.prototype.test = function() {
    return "Thing#test";
};
var t = new Thing();
t.own = function() {
    return "My own";
};

现在让我们玩t:

console.log(t.own());  // Logs "My own"

对于表达式t.own,引擎查看t以查看它是否具有名为"own"的属性。确实如此,因此使用该属性(函数)的值。之后的()调用该函数,该函数返回"My own",我们就完成了。

console.log(t.test()); // Logs "Thing#test"

对于表达式obj0,引擎查看t以查看它是否具有名为"test"的属性。事实并非如此,所以引擎会查看t的原型。t的原型是Thing.prototype,它是在表达new Thing时分配给它的。Thing.prototype具有"test"属性,因此使用该属性(函数)的值。然后()在调用该函数后返回字符串"prop"0。

console.log(t.toString()); // Logs "[object Object]"

引擎查看t,没有找到"toString"属性,所以它查看t的原型,没有发现"toString"属性,所以查看t的原型的原型(即Object.prototype)。确实具有"toString"属性,该属性的值是一个函数。然后()调用该函数,该函数返回"[object Object]"

最后,为了完整性:

console.log(t.foo());      // Throws an error

引擎在tt的原型或t的原型上找不到"foo"。现在它已经没有原型了,所以表达式t.foo产生了undefined。然后我们尝试通过()调用它,但我们不能这样做,因为undefined不是一个函数。