如果JavaScript没有';我不支持经典继承为什么我能够创建构造函数并使用new关键字?

如果JavaScript没有';我不支持经典继承为什么我能够创建构造函数并使用new关键字?,javascript,Javascript,根据MDN,javascript只支持原型继承。但我可以做到以下几点: function Human() { this.eyes = 2; this.feet = 2; } Var Mark = new Human(); 更令人困惑的是,我可以使用.prototype关键字向构造函数添加一个方法: Human.prototype.walk = function(distance) { //code } 然而,有一种正确的方法可以使用Object.create创建对象,这显然

根据MDN,javascript只支持原型继承。但我可以做到以下几点:

function Human() {

  this.eyes = 2;
  this.feet = 2;

}

Var Mark = new Human();
更令人困惑的是,我可以使用
.prototype
关键字向构造函数添加一个方法:

Human.prototype.walk = function(distance) {
  //code
}
然而,有一种正确的方法可以使用Object.create创建对象,这显然是正确的基于原型的对象创建:

var Human = {
  eyes: 2,
  feets: 2

}

var Mark = Object.create(Human);

有人能帮我澄清一下吗?谢谢

您首先应该了解的是,您作为示例提供的代码片段仍然是原型继承,原因如下:

  • Human
    是一个包含
    原型
    对象的函数。
    Human
    的实例使用自己在
    Human
    构造函数中初始化的数据扩展该原型对象
  • prototype
    对象可以在运行时修改。即使创建了类的实例,也可以通过添加或更改
    prototype
    对象上的属性来修改继承的行为。这一切在经典继承中都是不可能的
  • 在经典继承中,类和对象之间有着明显的区别。在原型继承中,类仅仅是一个对象,是一个可构造的函数,这意味着可以使用关键字调用它,但在其他方面,可以像对待任何其他对象一样对待它
根据这些信息,让我们展示和之间的一些关键相似性和差异:

functionhuman(){
这只眼睛=2;
这个。英尺=2;
}
Human.prototype.walk=函数(){};
var josh=新人类();

控制台日志(josh)您可以使用
new
,因为语言规范就是这样定义的。JavaScript的创建者也可以省略使用
new
关键字或
Object.create()
的可能性


new
本身并没有任何关于继承的暗示;它也可能存在于完全没有继承的语言中。它恰好是在JavaScript中创建新“对象”的关键字

根据语言的不同,
new
有不同的含义。它可以定义一个新对象的创建,但也可以包括在何处/如何分配内存的含义,和/或内存生命周期的责任

经典的基于继承的语言根本不需要
新的
关键字。或者它可能有一个弃用的
new
关键字,以便更好地用新版本的语言创建对象

您可以设想从描述符创建新对象的各种方法:

  new Descriptor(arg1, arg2);
  Descriptor obj(arg1, arg2);
  obj = Descriptor.alloc().init(arg1, arg2);
  obj = Descriptor.new(arg1, arg2);
  obj = create(Descriptor, arg1, arg2);
  ...
所有这些在不同的语言中可能有稍微不同的含义。因此,如果一种语言借用了另一种语言的关键词或概念,你不应该操心太多,因为大多数情况下,它们在次要(甚至关键)细节上存在差异


因此,利用你以前的知识来帮助学习新的语言,但不要试图在不同的语言之间完美地同义化这些概念。你必须记住,其他语言有不同的概念,即使它们看起来很相似。因此,简单地接受规范中给出的内容通常是有帮助的。

这些可能会有所帮助:旁注:如果这令人困惑,并且您有经典的继承背景,ES6
classes
hide所有这些(关键字hide,它仍然是隐藏的原型)。我仍然建议您在某个时候学习它。请记住,JavaScript继承模式中的一切行为都类似于来自其他编程语言的
public virtual
修饰符,而这正是您所坚持的。@JonathanLonowski第一个链接让我更加困惑,他为什么在经典继承中使用Object.create?顺便问一下,谁告诉过你Object.create()
是基于原型的“正确”对象创建?我觉得这根本不对。哦,我的天啊,Javascript是个迷宫,但你已经指明了方向。非常感谢您不厌其烦地把这一点讲清楚。你是个圣人,我会把它打印出来挂在墙上。哈哈,我不会走那么远,但我很高兴至少我能帮上忙。我希望您现在可以在深入研究MDN时继续探索这些概念和其他概念。我个人认为,尝试在语言之间进行映射是深入理解语言机制的一个好方法。例如,当我探讨JavaScript
Promise
和C#
任务
在语言层面的工作方式(与实现层面相反,实现层面尤其是C#)之间的差异时,由于我对另一种语言已有的知识,它向我揭示了很多东西,加深了我对另一种语言的理解。正因为如此,我不一定不鼓励语言之间的映射,只是不鼓励假设它们会完全相同。@PatrickRoberts是的,我的意思是,把它作为学习语言特性的提示,但不是为了强迫语言之间的映射。我对你的答案投了赞成票,因为我确实喜欢你所指出的。我只是想提供一个具体的例子,说明我通过这种方法获得的见解。很抱歉,如果我听起来像是在批评你的答案。@PatrickRoberts我总是很高兴听到批评,尤其是在措辞方面。因为一句话并不总能表达你要说的话。我对你的答案做了一些修改。我没有改变你说的话;你是怎么说的。如果您不喜欢现在的阅读方式,请随时回复。