首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何继承javascript函数?

如何继承javascript函数?
EN

Stack Overflow用户
提问于 2011-09-24 20:54:21
回答 2查看 11.1K关注 0票数 50
代码语言:javascript
复制
// Don't break the function prototype.
// pd - https://github.com/Raynos/pd
var proto = Object.create(Function.prototype, pd({
  "prop": 42
}));

var f = function() { return "is a function"; };
f.__proto__ = proto;

console.log(f.hasOwnProperty("prop")); // false
console.log(f.prop); // 42
console.log(f()); // "is a function"

.__proto__是非标准的,已弃用。

我应该如何继承原型创建对象,但让该对象成为一个函数。

Object.create返回一个对象,而不是一个函数。

new Constructor返回一个对象,而不是一个函数。

动机:-一个跨浏览器的finherit

代码语言:javascript
复制
var finherit = function (parent, child) {
    var f = function() { 
        parent.apply(this, arguments);
        child.apply(this, arguments);
    };
    f.__proto__ = parent;
    Object.keys(child).forEach(function _copy(key) {
        f[key] = child[key];
    });
    return f;
};

我不相信这是可能的,所以我们可能应该提出一个Function.create到es讨论邮件列表

代码语言:javascript
复制
/*
  Creates a new function whose prototype is proto.
  The function body is the same as the function fbody.
  The hash of propertydescriptors props is passed to defineproperties just like
  Object.create does.
*/
Function.create = (function() {
  var functionBody = function _getFunctionBody(f) {
    return f.toString().replace(/.+\{/, "").replace(/\}$/, "");
  };
  var letters = "abcdefghijklmnopqrstuvwxyz".split("");

  return function _create(proto, fbody, props) {
    var parameters = letters.slice(0, fbody.length);
    parameters.push(functionBody(fbody));
    var f = Function.apply(this, parameters);
    f.__proto__ = proto;
    Object.defineProperties(f, props);
    return f;
  };
})();

Related es-discuss mail

正如在ES讨论线程中提到的,存在一个ES:strawman <|原型操作符,它可以实现这一点。

让我们看看使用<|会是什么样子

代码语言:javascript
复制
var f1 = function () {
  console.log("do things");
};

f1.method = function() { return 42; };

var f2 = f1 <| function () {
  super();
  console.log("do more things");
}
console.log(f1.isPrototypeOf(f2)); // true
console.log(f2()); // do things do more things
console.log(f2.hasOwnProperty("method")); // false
console.log(f2.method()); // 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7539148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档