我注意到Function.prototype
在实验性JavaScript中有toMethod()
方法,但这实际上做了什么?我该如何使用它?
答案 0 :(得分:14)
更新:toMethod
方法仅为实验方法,并未将其纳入标准。 home对象现在基本上是静态的,操纵super
的唯一方法是更改[[prototype]]:
var base = {…}; // as below
var obj = Object.setPrototypeOf({
foo() { // needs to use method definition syntax
super.foo();
}
}, base);
obj.foo();
它与函数对象的bind
方法非常相似。但是,它不是创建具有绑定this
值的新函数,而是创建一个带有绑定[[HomeObject]]
的新函数,该函数是用于super
调用的引用:
[[HomeObject]]
(Object):如果函数使用super
,则这是[[GetPrototypeOf]]
提供超级属性查找开始的对象的对象。
考虑这个例子(不使用任何类语法):
var base = {
foo: function() {
console.log("base foo called on", this);
}
};
base.foo(); // base foo called on base
var obj = Object.create(base);
obj.foo(); // base foo called on obj
obj.foo = function() {
super.foo();
};
obj.foo(); // ReferenceError: this method has no home
obj.bar = obj.foo.toMethod(obj);
obj.bar(); // base foo called on obj
obj.baz = function() {
super();
};
obj.baz(); // ReferenceError: this constructor has no parent class
Reflect.setPrototypeOf(obj.baz, base.foo);
obj.baz(); // base foo called on obj
答案 1 :(得分:-1)
我的理解是.toMethod
就像克隆一个函数。考虑我发布的源代码中的示例
class P { }
class C extends P {
foo() {
console.log("f");
super();
}
}
P.prototype.foo=C.prototype.foo;
(new C).foo();
在这里,您引用了超类中的子类方法.foo
,因此当您致电.foo
时,它会引用P
' s .foo
,即C
1}}' s .foo
你刚刚创建了一个循环。
似乎要解决这个问题,你可以使用.toMethod
"克隆"该功能并给它一个不同的super
/" home"你指定的:
P.prototype.foo = C.prototype.foo.toMethod(P.prototype);
现在呼叫(new C).foo()
不会永远持续下去。