JavaScript对象可以有一个原型链,但也可以是一个函数?

Dan*_*idy 17 javascript inheritance

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () { };
c.prototype = a;

var d = new c();
d.b(); // returns "bar"
d(); // throws exception, d is not a function
Run Code Online (Sandbox Code Playgroud)

有没有办法d成为一个函数,但仍然继承属性a

Dan*_*idy 10

实际上,事实证明这是可能的,尽管是以非标准的方式.

Mozilla,Webkit,Blink/V8,Rhino和ActionScript提供了非标准__proto__属性,允许在创建对象后更改对象的原型.在这些平台上,可以使用以下代码:

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () {
    return "hatstand";
}
c.__proto__ = a;

c(); // returns "hatstand"
c.b(); // returns "bar"; inherited from a
Run Code Online (Sandbox Code Playgroud)

这可能对任何不需要担心跨平台兼容性的人都有用.

但请注意,只能继承对象的属性.例如:

var d = {};
d.__proto__ = a;
d.b(); // returns "bar"
d(); // throws exception -- the fact that d is inheriting from a function
     // doesn't make d itself a function.
Run Code Online (Sandbox Code Playgroud)


Eug*_*kin 8

简短的回答:不可能.

这行代码:

var d = new c();
Run Code Online (Sandbox Code Playgroud)

自动假设这d是一个对象.除非c是内置对象的构造函数,例如Function.但是如果c已经由语言定义,你就无法操纵它的原型,也不能从你喜欢的任何东西"继承"它.好吧,在一些口译员中你可以,但是你不能安全地在所有口译员中做到 - 标准说:"你不会弄乱标准物品,或者翻译会打击你!".

内置对象是"唯一的",JavaScript不提供复制它们的方法.如果不诉诸不兼容的技巧,就无法重新创建字符串,数字,函数等.


Ale*_*exB 6

基于关于类似问题的元讨论, 我将根据@alexander-mills原件在此处发布此答案


这现在可以以符合标准的方式完成

首先创建一个继承的对象 Function

const obj = Object.create(Function.prototype);  // Ensures availability of call, apply ext
Run Code Online (Sandbox Code Playgroud)

然后将您的自定义方法和属性添加到 obj

接下来声明函数

const f = function(){
    // Hello, World!
};
Run Code Online (Sandbox Code Playgroud)

并设置obj为原型f

Object.setPrototypeOf(f,obj);
Run Code Online (Sandbox Code Playgroud)

示范

const obj = Object.create(Function.prototype);  // Ensures availability of call, apply ext
Run Code Online (Sandbox Code Playgroud)