Mji*_*iig 0 javascript methods dispatch
谁能解释当调用方法选择运行哪个函数时JavaScript所经历的过程?我能找到的大多数在线资源都解释了如何使用JavaScript对象实现特定行为,但没有解释方法分配在JavaScript中的工作原理。
“方法分派”实际上只是属性查找,因为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 Thing。Thing.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"上t,t的原型,或者t的原型的原型。现在它已经超出了原型,因此表达式t.foo结果为undefined。然后,我们尝试通过调用它(),因为undefined它不是函数,所以我们不能这样做。
| 归档时间: |
|
| 查看次数: |
1762 次 |
| 最近记录: |