自定义函数类

时间:2012-11-05 07:17:36

标签: javascript

我正在开发一个涉及从其他函数构建函数的项目。我想写一个简化课程的课程,但是如果不使用__proto__我就无法让它工作。

这基本上就是我的愿景。

function MyFunction () {
    // ...
}
var myFn = new MyFunction();
myFn(); // executes without error
myFn instanceof MyFunction; // returns true

以下代码仅使用__proto__

function MyFunction () {
    var fn = function () { return 'hello'; };
    fn.__proto__ = this;
    return fn;
}
var myFn = new MyFunction();
alert( myFn() ); // hello
alert( myFn instanceof MyFunction ); // true

以下是我尝试使用valueOf

的内容
function MyFunction () {
    this.fn = function () { return 'hello'; };
    this.valueOf = function () { return this.fn; };
}
var myFn = new MyFunction();
alert( myFn instanceof MyFunction ); // true
alert( myFn.valueOf()() ); // hello
alert( myFn() ); // error

这是扩展函数以包含MyFunction的所有属性的其他内容。

function MyFunction () {
    this.foo = 'hello'
    var fn = function () { return 'hello'; };
    for ( var i in this ) {
        fn[ i ] = this[ i ];
    }
    return fn;
}
var myFn = new MyFunction();
alert( myFn() ); // hello
alert( myFn.foo ); // hello
alert( myFn instanceof MyFunction ); // false

我不想使用__proto__因为它是非标准的。此外,这是一个奇怪的想法,我真的想让它工作,但如果不可能我会活着。但我想我的问题是,我想做的是什么?

1 个答案:

答案 0 :(得分:2)

引人入胜的想法。我不相信你能用标准ECMAScript做到这一点,甚至不使用ES5。

ES5使我们能够更好地访问和控制原型,包括在使用Object.create创建对象(无需通过构造函数)时提供设置原型的方法,但是您无法构建通过该机制功能。这就是你需要做的,因为instanceof使用抽象规范[[HasInstance]]方法,目前只有函数实现,而function implementation of it通过查看是否有效对象的底层原型([[Proto]])对函数===属性prototype。设置对象基础原型的唯一标准方法是通过new MyFunctionObject.create创建它,并且这两种机制都不会创建函数对象。

ES.next可能使这成为可能。有一个提案被提升为&#34;和谐&#34;对于&#34; set prototype operator&#34;,<|的状态(因此,相当高级),旨在解决当前通过__proto__解决的许多问题。其中一个问题是&#34;将函数原型设置为Function.prototype&#34;以外的其他函数。使用它(以当前形式),您的MyFunction看起来像这样:

function MyFunction () {
  return MyFunction.prototype <| function () { return 'hello'; };
}
MyFunction.prototype = Object.create(Function.prototype);

最后一点是MyFunction.prototype是原型Function.prototype的对象,因此通过MyFunction构建的函数有callapplybind等。