我正在从事一个涉及从其他函数构造函数的项目。我有编写一个类来简化事情的想法,但如果不使用 __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__
因为它是非标准的。此外,这是一个怪异的想法,我真的很想让它发挥作用,但如果不可能,我会活下去。但我想我的问题是,我想做的事情是否可行?
最佳答案
迷人的想法。我不相信你可以用标准的 ECMAScript 做到这一点,甚至不使用 ES5。
ES5 使我们能够更好地访问和控制原型(prototype),包括提供一种在使用 Object.create
创建对象时设置原型(prototype)的方法(无需通过构造函数)。 ,但您不能通过该机制构造函数。这就是你必须做的,因为 instanceof
使用抽象规范 [[HasInstance]]
方法,目前仅由函数实现,以及 function implementation of it通过查看对象的底层原型(prototype) ( [[Proto]]
) 是否为 ===
来工作到函数的 prototype
属性(property)。设置对象底层原型(prototype)的唯一标准方法是通过new MyFunction
创建它。或通过 Object.create
,并且这两种机制都不会创建函数对象。
ES.next 可以使这成为可能。对于“set prototype operator”、<|
,有一项提案已提升为“和谐”状态(因此,相当先进) ,旨在解决目前通过 __proto__
解决的许多问题.它的用途之一是“将函数的原型(prototype)设置为 Function.prototype
以外的东西”。使用它(以当前形式),您的 MyFunction
看起来像这样:
function MyFunction () {
return MyFunction.prototype <| function () { return 'hello'; };
}
MyFunction.prototype = Object.create(Function.prototype);
最后一点是让它成为 MyFunction.prototype
是一个原型(prototype)为 Function.prototype
的对象, 因此通过 MyFunction
构建的函数有call
, apply
, bind
等
关于javascript - 自定义函数类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13227623/