我注意到实验性 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 .foo
which is C
's.foo
并且您刚刚创建了一个循环。
似乎要解决这个问题,您可以使用.toMethod
which "clone" 函数并为其指定一个不同的super
/"home":
P.prototype.foo = C.prototype.foo.toMethod(P.prototype);
现在呼叫(new C).foo()
不会永远持续下去。
其它你可能感兴趣的问题