我注意到实验性 JavaScript 中Function.prototype有一个toMethod()方法,但这实际上是做什么的?我该如何使用它?
Function.prototype.toMethod() 有什么作用?
IT技术
javascript
ecmascript-6
2021-03-15 07:00:54
2个回答
更新:该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
我的理解是这.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 .foowhich is C's.foo并且您刚刚创建了一个循环。
似乎要解决这个问题,您可以使用.toMethodwhich "clone" 函数并为其指定一个不同的super/"home":
P.prototype.foo = C.prototype.foo.toMethod(P.prototype);
现在呼叫(new C).foo()不会永远持续下去。
其它你可能感兴趣的问题