javascript - 自定义函数类

标签 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__ 因为它是非标准的。此外,这是一个怪异的想法,我真的很想让它发挥作用,但如果不可能,我会活下去。但我想我的问题是,我想做的事情是否可行?

最佳答案

迷人的想法。我不相信你可以用标准的 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/

相关文章:

javascript - 推荐 Riak mapreduce Javascript VM 池大小用于映射和减少阶段? (mapred超时错误)

javascript - 在 JavaScript 中使用过滤器进行快速排序

javascript - D3JS 每个圆/节点都有不同的图像

javascript - 删除所有数据属性的功能,需要多次运行

php - 如何停止使用 Jquery/Ajax 提交表单

javascript - three.js - 如何翻译几何

javascript - 在 node_modules 中找不到第三方 VueJS 组件

javascript - Jquery 绑定(bind)事件不响应

javascript - 将变量与 id jquery 连接

javascript - Promise.all 中的 Promise 没有被执行