创建与其他函数链接的函数对象

Creating a function object linked with other function?

本文关键字:函数 对象 链接 创建 其他      更新时间:2023-09-26

我知道,

  • 我们可以创建新的对象&使用链接给定对象作为其原型CCD_ 1
  • 我们可以使用new关键字创建新对象对于任何函数,它创建一个与该函数的原型对象

但是,我在浏览器控制台中看到了一些功能,如HTMLBodyElementHTMLElementXMLHttpRequest

HTMLElement.__proto__ === Element

HTMLElement是一个函数,它的原型是Element,也是一个函数。我的问题是HTMLElement是如何创建的,它的原型是如何与Object.create()0功能联系在一起的。他们用来创建HTMLElement的语法是什么?

正如Felix Kling在他的评论中指出的,有问题的函数是由环境提供的。因此,如果不阅读浏览器JS引擎的sporce代码,或者幸运的话,不阅读它的文档,你就不会发现"HTMLElement是如何创建的"。

但我想你的问题是如何自己创建这样的结构,这相当容易。以下是您可以使用的几种方法之一。

function Foo(){}
Foo.prototype = Element.prototype;

使用进行验证

(new Foo()) instanceof Element

例如,在您的控制台中,您将获得true。不知怎么的,我宁愿称之为混音

另一种方法是,保留Foo作为构造函数:

Foo.prototype = new Bar();

其中Bar是"父"类。这样做的优点是在构造函数中创建的函数和变量也可用于子类。注意,Element不允许您直接构造新实例,因此我选择了不同的父实例。

如果你想添加更多的方法和字段,你可以在"链接"原型(你的话(后这样做:

Foo.prototype.foobar = "foobar";
Foo.prototype.getFoobar = function() {
    return this.foobar;
}

或者在构造函数中执行此操作。

原型继承是一件有趣的事情,但可能很难理解。玩一玩。

更新

关于OP所谓的误解(见评论(,不要混淆prototype__proto__

一般来说,__proto__存储对象的构造函数的prototype。在这种情况下,这意味着(new Foo()).__proto__ === Foo.prototype__proto__存储类的实例之间共享的方法和字段。

因此,Foo.__proto__ === Function.prototype === Empty与类Foo的实际实例的继承无关。

有关更多信息,请参阅以下两个问题:

  • javascript中的-function Empty((是什么
  • __proto__ VS JavaScript中的prototype