2012-11-05 52 views
2

我正在从事一个涉及从其他函数构造函数的项目。我有写作课程来简化事情的想法,但是我没有使用__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。我不想使用__proto__,因为它不是标准的。此外,这是一个怪胎的想法,我真的想让它工作,但如果这是不可能的,我会活下去。但我想我的问题是,我想做什么?

回答

2

奇妙的想法。我不相信你可以用标准的ECMAScript来完成它,甚至不使用ES5。

ES5使我们能够更好地访问和控制原型,包括提供设置创建对象(而不必通过构造函数)与Object.create时原型的一种手段,但你不能经由构建功能机制。这就是你需要做的事情,因为instanceof使用抽象规格[[HasInstance]]方法,目前只能通过函数实现,而function implementation of it通过查看对象的解除原型([[Proto]])是否为===到函数的prototype属性来工作。设置对象的基础原型的唯一标准方式是通过new MyFunction或通过Object.create来创建它,也不机制创建了一个函数对象。

ES.next可以使这成为可能。还有一个已经晋升为“和谐”状态(所以,相当先进)为“set prototype operator”,<|,其目的是解决许多当前通过__proto__解决的问题的提案。其中一件事情是“将函数的原型设置为Function.prototype以外的其他东西”。使用它(目前的形式),你MyFunction会是这个样子:

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

最后一点是要使其成为MyFunction.prototype与原型Function.prototype的对象,这样通过MyFunction构造函数有callapplybind

+0

无赖,我也听到了某种形式的'__proto__'将在未来ES正式加入了。我想我只是在我的时间之前:(噢,好吧。 – SpaceFace