我正在开发一个涉及从其他函数构建函数的项目。我想写一个简化课程的课程,但是如果不使用__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__
因为它是非标准的。此外,这是一个奇怪的想法,我真的想让它工作,但如果不可能我会活着。但我想我的问题是,我想做的是什么?
答案 0 :(得分:2)
引人入胜的想法。我不相信你能用标准ECMAScript做到这一点,甚至不使用ES5。
ES5使我们能够更好地访问和控制原型,包括在使用Object.create
创建对象(无需通过构造函数)时提供设置原型的方法,但是您无法构建通过该机制功能。这就是你需要做的,因为instanceof
使用抽象规范[[HasInstance]]
方法,目前只有函数实现,而function implementation of it通过查看是否有效对象的底层原型([[Proto]]
)对函数===
属性prototype
。设置对象基础原型的唯一标准方法是通过new MyFunction
或Object.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
构建的函数有call
,apply
,bind
等。