3

我正在从事一个涉及从其他功能构建功能的项目。我有编写一个类来简化事情的想法,但如果不使用__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__,因为它是非标准的。此外,这是一个奇怪的想法,我真的很想让它发挥作用,但如果不可能,我会活下去。但我想我的问题是,我想做的事情可能吗?

4

1 回答 1

3

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

ES5 让我们可以更好地访问和控制原型,包括在创建对象时提供一种设置原型的方法(无需通过构造函数)Object.create,但您不能通过该机制构造函数。这就是你必须要做的,因为instanceof使用抽象规范[[HasInstance]]方法,目前仅由函数实现,并且它的函数实现通过查看对象的底层原型 ( [[Proto]]) 是否===与函数的prototype属性来工作。设置对象底层原型的唯一标准方法是通过new MyFunction或通过创建它Object.create,这两种机制都不会创建函数对象。

ES.next 可能使这成为可能。有一个提案被提升为“和谐”状态(因此,相当先进),用于“设置原型运算符”,<|旨在解决目前通过__proto__. 它的用途之一是“将函数的原型设置为Function.prototype”。使用它(以其当前形式),您MyFunction将看起来像这样:

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

最后一点是使其成为MyFunction.prototype具有原型的对象Function.prototype,以便通过MyFunction具有call、、、apply等构造的函数bind

于 2012-11-05T07:42:12.393 回答