理解Javascript超级方法仿真代码

理解Javascript超级方法仿真代码,javascript,inheritance,super,Javascript,Inheritance,Super,我在读Javascript中的超级方法。在底部,作者使用了一种方法,它本质上涉及到为每个方法函数对象添加一个name属性,并使用它在调用super的当前对象的原型链上找到一个匹配的方法 我将复制以下内容: 它使用下划线.js和Backbone.js,我对它们不太熟悉,但它们的用法并不存在疑问 设置super属性getter时,会声明4个变量:impl、name、foundImpl和proto impl保存调用super的方法,该方法通过get.caller获得name是调用super的方法的名称

我在读Javascript中的超级方法。在底部,作者使用了一种方法,它本质上涉及到为每个方法函数对象添加一个name属性,并使用它在调用super的当前对象的原型链上找到一个匹配的方法

我将复制以下内容:

它使用下划线.js和Backbone.js,我对它们不太熟悉,但它们的用法并不存在疑问

设置
super
属性getter时,会声明4个变量:
impl
name
foundImpl
proto

impl
保存调用
super
的方法,该方法通过
get.caller
获得
name
是调用
super
的方法的名称(如果不是从方法中调用
super
,则为
undefined
proto
保存调用方法的对象,在找到超级方法之前,其原型链将被打断

现在
foundImpl
对我来说有点困惑。它是一个布尔值,首先被赋予
this[name]==impl
的值。由于
this
指向从中调用方法的对象,因此
this[name]
将返回方法本身,方法本身将是
==
impl
。每次都是这样,除非
名称
未定义的
(我们在方法外称之为
超级

while(proto=Object.getPrototypeOf(proto))
然后开始迭代调用对象的原型链,从直接父对象开始,直到它达到
null

if(!proto[name])
检查当前原型中是否有同名的方法。如果没有,它将跳出循环,如果
foundImpl
为false,则将抛出一个错误。如前所述,我能看到这种情况发生的唯一情况是,如果在方法外部调用了
super
,其中
name
将是
undefined
,因此
this[name]==impl
也将是false。否则,因为
foundImpl
从一开始就已为真

else if(proto[name]==impl)
将检查同名的当前原型方法是否严格等同于调用
super的方法。老实说,我想不出这种情况会是真的,因为要从方法调用
super
,必须重写它,使两个函数对象都不同。例如:

var a = { method: function(){ return "Hello!"; } };
var b = Object.create(a);
console.log(a.method === b.method); //true
b.method = function(){ return "Hello World!"; };
console.log(a.method === b.method); //false
也许这毕竟只是一个安全检查,而这个条件永远也达不到

最后,
else if(foundImpl)
将检查
foundImpl
是否为真(可能在第一次循环迭代时为真,上述特殊情况除外),如果为真,则返回当前的
proto[name]
方法



所以我的疑问是第二个条件的意义是什么:
如果(proto[name]==impl)
?它包括什么箱子?
foundImpl
到底扮演什么角色?

哇,我好久没想到那篇博文了!我相信大多数常青浏览器已经放弃了对
参数的支持。调用者
在这一点上,这使得演示代码有点难以编写,但我会尽我所能解释。非常感谢Dan,完美的解释!现在一切都有了意义:)
var a = { method: function(){ return "Hello!"; } };
var b = Object.create(a);
console.log(a.method === b.method); //true
b.method = function(){ return "Hello World!"; };
console.log(a.method === b.method); //false