Javascript方法调度过程

Javascript方法调度过程,javascript,methods,dispatch,Javascript,Methods,Dispatch,有人能解释一下JavaScript在调用一个方法来选择运行哪个函数时所经历的过程吗?我在网上找到的大多数资源都解释了如何使用JavaScript对象实现特定行为,但没有解释JavaScript中方法分派工作的一般原理。“方法分派”实际上只是属性查找,因为JavaScript中的“方法”只是通过对象属性使用的函数。(更多信息请访问我的博客:) 当你写作时: obj.prop JavaScript引擎查看obj对象,查看它是否具有名为“prop”的属性。如果是,则使用该属性的值。如果没有,引擎将在

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

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

当你写作时:

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

在某些允许方法重载的语言中,没有任何类型的“方法签名”匹配。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”
的属性。确实如此,因此使用该属性(函数)的值。调用该函数后的
()
,返回
“我自己的”
,我们就完成了

console.log(t.test()); // Logs "Thing#test"
对于表达式
t.test
,引擎查看
t
以查看其是否具有名为
“test”
的属性。它没有,所以引擎会查看
t
的原型
t
的原型是
Thing.prototype
,在表达式
new Thing
期间分配给它<代码>东西。原型有一个
“test”
属性,因此使用该属性(函数)的值。然后调用该函数后的
()
,该函数返回字符串
“Thing#test”

引擎查看
t
,没有找到
的“toString”
属性,因此它查看
t
的原型,没有找到
的“toString”
属性,因此它查看
t
的原型(即
对象.prototype
)。它确实有一个
“toString”
属性,其值是一个函数。然后
()
调用函数,该函数返回
“[object object]”

最后,为了完整性:

console.log(t.foo());      // Throws an error
发动机在
t
t
的原型或
t
的原型上找不到
“foo”
。现在它没有原型了,所以表达式
t.foo
导致
未定义。然后我们尝试通过
()
调用它,我们不能这样做,因为
未定义的
不是一个函数。

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

当你写作时:

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

在某些允许方法重载的语言中,没有任何类型的“方法签名”匹配。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”
的属性。确实如此,因此使用该属性(函数)的值。调用该函数后的
()
,返回
“我自己的”
,我们就完成了

console.log(t.test()); // Logs "Thing#test"
对于表达式
t.test
,引擎查看
t
以查看其是否具有名为
“test”
的属性。它没有,所以引擎会查看
t
的原型
t
的原型是
Thing.prototype
,在表达式
new Thing
期间分配给它<代码>东西。原型
有一个
“test”
属性,因此使用该属性(函数)的值。然后调用该函数后的
()
,该函数返回字符串
“Thing#test”

引擎查看
t
,没有找到
的“toString”
属性,因此它查看
t
的原型,没有找到
的“toString”
属性,因此它查看
t
的原型(即
对象.prototype
)。它确实有一个
“toString”
属性,其值是一个函数。然后
()
调用函数,该函数返回
“[object object]”

最后,为了完整性:

console.log(t.foo());      // Throws an error
发动机在
t
t
的原型或
t
的原型上找不到
“foo”
。现在它没有原型了,所以表达式
t.foo
导致
未定义。然后我们尝试通过
()
调用它,但我们不能这样做,因为
未定义的
不是一个函数