- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 this article关于 Javascript 中的 super 方法。最下面是作者使用的一种方法,本质上是为每个方法函数对象添加一个name属性,并使用它在当前调用super的对象的原型(prototype)链上找到匹配的方法。
我将复制 code下面:
var Base = function() {};
// Use the regular Backbone extend, but tag methods with their name
Base.extend = function() {
var Subclass = Backbone.Model.extend.apply(this, arguments);
_.each(Subclass.prototype, function(value, name) {
if (_.isFunction(value)) {
value._methodName = name;
}
});
return Subclass;
};
// Define a special `super` property that locates the super implementation of the caller
Object.defineProperty(Base.prototype, "super", {
get: function get() {
var impl = get.caller,
name = impl._methodName,
foundImpl = this[name] === impl,
proto = this;
while (proto = Object.getPrototypeOf(proto)) {
if (!proto[name]) {
break;
} else if (proto[name] === impl) {
foundImpl = true;
} else if (foundImpl) {
return proto[name];
}
}
if (!foundImpl) throw "`super` may not be called outside a method implementation";
}
});
它使用了Underscore.js和Backbone.js,我不是很熟悉,但它们的用法不是疑点所在。
设置super
属性getter时,声明了4个变量:impl
、name
、foundImpl
和原型(prototype)
。
impl
保存调用super
的方法,通过get.caller
获取。 name
是调用 super
的方法的名称(或 undefined
如果 super
不是从方法中调用的). proto
保存调用方法的对象,其原型(prototype)链将被遍历,直到我们找到 super 方法。
现在 foundImpl
让我有点困惑。它是一个 bool 值,最初被赋予 this[name] === impl
的值。由于 this
指向调用方法的对象,this[name]
将返回方法本身,即 ===
到 impl
。每次都是这样,除非 name
是undefined
(我们在方法外调用super
)。
行 while(proto = Object.getPrototypeOf(proto))
然后开始遍历调用对象的原型(prototype)链,从直接父级开始,直到到达 null
.
if(!proto[name])
检查当前原型(prototype)中是否有同名方法。如果不存在,它会跳出循环,如果 foundImpl
为 false,则会抛出错误。如前所述,我能看到这种情况发生的唯一情况是如果 super
在方法外部调用,其中 name
将是 undefined
,因此this[name] === impl
也将为 false。否则,因为 foundImpl
从一开始就已经为真。
else if (proto[name] === impl)
将检查当前具有相同名称的原型(prototype)方法是否严格等于调用 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]
方法。
所以我怀疑第二个条件的意义是什么:else if (proto[name] === impl)
?它涵盖什么情况? foundImpl
的作用到底是什么?
最佳答案
哇,我好久没有想过这篇博文了!我相信大多数常青浏览器在这一点上已经放弃了对 arguments.caller
的支持,这使得演示代码有点难以编写,但我会尽力解释 🙂
您指出的令人困惑的行是 foundImpl = this[name] === impl
,乍一看它总是评估为 true
。需要它的原因(实际上首先让我对“super
问题”感兴趣的原因)是您链接了 super
调用的情况。
考虑这样的设置:
const Base = /* ... */;
const First = Base.extend({
sayHello() {
console.log('First#sayHello()');
}
});
const Middle = First.extend({
sayHello() {
this.super();
console.log('Middle#sayHello()');
}
});
const Last = Middle.extend({
sayHello() {
this.super();
console.log('Last#sayHello()');
}
});
如果我调用 new Last().sayHello()
,该 super
getter 将被调用两次。第一次,正如您所说的那样,this[name] === impl
将立即为真。
不过,在第二个 调用中,调用者将是来自Middle
的函数,但是this[name]
将是来自Middle
的函数Last
,所以 this[name] === impl
将为 false。
然后会继续执行原型(prototype)遍历循环,往上走一步后,我们会发现proto[name] === impl
,所以foundImpl
将设置为 true,我们将再次执行循环并从 Base
正确返回函数。
关于javascript - 了解 Javascript super 方法模拟代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48614202/
我开始在 Ethereum blockchain 上了解如何开发智能合约以及如何写 web-script用于与智能合约交互(购买、销售、统计......)我得出了该怎么做的结论。我想知道我是否正确理解
我正在 UIView 中使用 CATransform3DMakeRotation,并且我正在尝试进行 45º,变换就像向后放置一样: 这是我拥有的“代码”,但显然没有这样做。 CATransform3
我目前正在测试 WebRTC 的功能,但我有一些脑逻辑问题。 WebRTC 究竟是什么? 我只读了“STUN”、“P2P”和其他...但是在技术方面什么是正确的 WebRTC(见下一个) 我需要什么
我在看 DelayedInit在 Scala in Depth ... 注释是我对代码的理解。 下面的 trait 接受一个非严格计算的参数(由于 => ),并返回 Unit .它的行为类似于构造函数
谁能给我指出一个用图片和简单的代码片段解释 WCF 的资源。我厌倦了谷歌搜索并在所有搜索结果中找到相同的“ABC”文章。 最佳答案 WCF 是一项非常复杂的技术,在我看来,它的文档记录非常少。启动和运
我期待以下 GetArgs.hs打印出传递给它的参数。 import System.Environment main = do args main 3 4 3 :39:1: Coul
private int vbo; private int ibo; vbo = glGenBuffers(); ibo = glGenBuffers(); glBindBuffer(GL_ARRAY_
我正在尝试一个 for 循环。我添加了一个 if 语句以在循环达到 30 时停止循环。 我见过i <= 10将运行 11 次,因为循环在达到 10 次时仍会运行。 如果有设置 i 的 if 语句,为什
我正在尝试了解 WSGI 的功能并需要一些帮助。 到目前为止,我知道它是一种服务器和应用程序之间的中间件,用于将不同的应用程序框架(位于服务器端)与应用程序连接,前提是相关框架具有 WSGI 适配器。
我是 Javascript 的新手,我正在尝试绕过 while 循环。我了解它们的目的,我想我了解它们的工作原理,但我在使用它们时遇到了麻烦。 我希望 while 值自身重复,直到两个随机数相互匹配。
我刚刚偶然发现Fabric并且文档并没有真正说明它是如何工作的。 我有根据的猜测是您需要在客户端和服务器端都安装它。 Python 代码存储在客户端,并在命令运行时通过 Fabric 的有线协议(pr
我想了解 ConditionalWeakTable .和有什么区别 class ClassA { static readonly ConditionalWeakTable OtherClass
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我还没有成功找到任何可以引导我理解 UIPickerView 和 UIPickerView 模型的好例子。有什么建议吗? 最佳答案 为什么不使用默认的 Apple 文档示例?这是来自苹果文档的名为 U
我在看foldM为了获得关于如何使用它的直觉。 foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a 在这个简单的例子中,我只返回 [Just
答案What are _mm_prefetch() locality hints?详细说明提示的含义。 我的问题是:我想要哪一个? 我正在处理一个被重复调用数十亿次的函数,其中包含一些 int 参数。
我一直在读这个article了解 gcroot 模板。我明白 gcroot provides handles into the garbage collected heap 然后 the handle
提供了一个用例: 流处理架构;事件进入 Kafka,然后由带有 MongoDB 接收器的作业进行处理。 数据库名称:myWebsite集合:用户 并且作业接收 users 集合中的 user 记录。
你好 我想更详细地了解 NFS 文件系统。我偶然发现了《NFS 图解》这本书,不幸的是它只能作为谷歌图书提供,所以有些页面丢失了。有人可能有另一个很好的资源,这将是在较低级别上了解 NFS 的良好开始
我无法理解这个问题,哪个更随机? rand() 或: rand() * rand() 我发现这是一个真正的脑筋急转弯,你能帮我吗? 编辑: 凭直觉,我知道数学答案是它们同样随机,但我忍不住认为,如果您
我是一名优秀的程序员,十分优秀!