【发布时间】:2018-02-19 22:32:04
【问题描述】:
我从here查看了以下示例
但我无法从 LINE 1 理解:
Function.method('inherits', function(parent){
this.prototype = new parent();
var d = {},
p = this.prototype;
this.prototype.constructor = parent;
this.method('uber', function uber(name){ //LINE 1
if(!(name in d)){
d[name] = 0;
}
var f, r, t = d[name], v = parent.prototype;
if(t){
while(t){
v = v.constructor.prototype;
t -= 1;
}
f = v[name];
} else {
f = p[name];
if(f == this[name]){
f = v[name];
}
}
d[name] +=1;
r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
d[name] -= 1;
return r;
});
return this;
});
【问题讨论】:
-
它已经过时了(从 ES5 开始,你会使用
Object.create而不是new parent()- 我们在 ES2017/ES8 上)并且写得不好,所以不要太担心。 -
虽然您的好奇心是可以理解的,但对我个人而言,该实现看起来完全是垃圾,并且由于 ES6
class语法的广泛使用以及像 Babel 这样的转译器以实现向后兼容性,因此已经过时。一旦你理解了这段代码,请在互联网上帮个忙,不要试图重复使用它。 -
@Ryan 和 Patrick Roberts:我只是想理解它,这样我就可以理解我正在阅读的 JS 书中的一些其他示例。
-
@kittu:如果你的 JS 书在讲这个函数的实现细节,那它可能已经过时了。如果您只需要知道它的作用——它是继承(在定义构造函数
Derived之后,您可以Derived.inherits(Base)使Derived实例具有Base原型)和一种调用“覆盖”方法的方式父类(super.foo(x)在 ES6 和其他语言中会写成this.uber('foo', x))。 -
@Ryan 我不明白检查
d[name]就像if(t){一样
标签: javascript