我知道,
Object.create()
。 new
关键字创建新对象
使用任何函数,创建一个与该函数链接的对象
原型对象。但是,我在浏览器控制台中看到了一些功能,例如HTMLBodyElement
,HTMLElement
,XMLHttpRequest
,
HTMLElement.__proto__ === Element
HTMLElement
是函数,其原型为Element
,也是函数。我的问题是如何创建HTMLElement
以及如何将其原型与Element
函数相关联。他们用来创建HTMLElement的语法是什么?
答案 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
的实际实例无关。
有关详细信息,请参阅以下两个问题: