JavaScript方法调度过程

Mji*_*iig 0 javascript methods dispatch

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

T.J*_*der 5

“方法分派”实际上只是属性查找,因为JavaScript中的“方法”只是通过对象属性使用的函数。(有关我的博客的更多信息:神话方法

当你写:

obj.prop
Run Code Online (Sandbox Code Playgroud)

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

目前没有任何一类的一些语言,允许方法重载“方法签名”匹配。JavaScript没有方法重载。具有给定名称的对象只能有一个属性。

让我们看一个例子:

function Thing() {
}
Thing.prototype.test = function() {
    return "Thing#test";
};

var t = new Thing();
t.own = function() {
    return "My own";
};
Run Code Online (Sandbox Code Playgroud)

现在让我们玩t

console.log(t.own());  // Logs "My own"
Run Code Online (Sandbox Code Playgroud)

对于表达式t.own,引擎t将查看其是否具有称为的属性"own"。确实如此,因此使用该属性(一个函数)的值。在()调用该函数,该函数返回"My own",我们就大功告成了。

console.log(t.test()); // Logs "Thing#test"
Run Code Online (Sandbox Code Playgroud)

对于表达式t.test,引擎t将查看其是否具有称为的属性"test"。否,因此引擎会查看t的原型。t的原型是Thing.prototype,在表达式期间已分配给它new ThingThing.prototype具有"test"属性,因此使用该属性(函数)的值。然后()after调用该函数,该函数返回string "Thing#test"

console.log(t.toString()); // Logs "[object Object]"
Run Code Online (Sandbox Code Playgroud)

引擎查看t,未找到"toString"属性,因此查看t的原型,也未找到"toString"属性,因此查看t的原型的原型(Object.prototype)。那确实有一个"toString"属性,其值是一个函数。然后()调用函数,该函数返回"[object Object]"

最后,为了完整性:

console.log(t.foo());      // Throws an error
Run Code Online (Sandbox Code Playgroud)

发动机没有找到"foo"tt的原型,或者t的原型的原型。现在它已经超出了原型,因此表达式t.foo结果为undefined。然后,我们尝试通过调用它(),因为undefined它不是函数,所以我们不能这样做。