Function.prototype.toMethod()做什么?

时间:2014-12-16 18:42:11

标签: javascript ecmascript-6

我注意到Function.prototype在实验性JavaScript中有toMethod()方法,但这实际上做了什么?我该如何使用它?

2 个答案:

答案 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()不会永远持续下去。