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

时间:2014-07-23 06:09:47

标签: javascript dom prototype

我知道,

  • 我们可以创建新对象&链接给定对象作为其原型使用 Object.create()
  • 我们可以使用new关键字创建新对象 使用任何函数,创建一个与该函数链接的对象 原型对象。

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

HTMLElement.__proto__ === Element

HTMLElement函数,其原型为Element,也是函数。我的问题是如何创建HTMLElement以及如何将其原型与Element函数相关联。他们用来创建HTMLElement的语法是什么?

1 个答案:

答案 0 :(得分:2)

正如Felix Kling在评论中指出的那样,所讨论的功能是由环境提供的。因此,如果没有浏览浏览器的JS引擎的sporce代码,或者 - 如果你很幸运 - 它的文档,你就不会发现“HTMLElement是如何创建的。”

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

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

验证:

(new Foo()) instanceof Element

例如,在您的控制台中,您将获得true。不管怎么说,我宁愿把它称为 mixin

另一种方法是,将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的实际实例无关。

有关详细信息,请参阅以下两个问题:

相关问题