理解Javascript原型继承

Understanding of Javascript prototypal inheritance

本文关键字:继承 原型 Javascript 理解      更新时间:2024-04-05

我正试图了解Javascript继承,并想检查我的理解是否正确。当我在JS中这样声明Javascript函数时:

function Animal() {
}

现在第一个问题:

  1. 我声明Function对象。这与JS附带的Array没有什么不同。Array也是JS原生提供的Function对象,对吗?那么ObjectRegExp以及其他的呢?是这样吗?

  2. 说这个对象继承自Function是不正确的,但有人能解释一下为什么吗?这是因为没有像Java和其他语言那样使用正式类吗?还是因为Animal采用了实际存在对象的属性,而不是其他语言中的类的蓝图?还有其他原因吗?

对以上内容的澄清将不胜感激,干杯,

编辑:我的问题似乎引起了混乱,所以我应该澄清一下。在第1点中,我并不是在问Array返回了什么。我只是想确认我的理解,函数AnimalArray都有一个共同点,即它们的[[Prototype]]属性引用了相同的Function.prototype,因此它们都是Function对象。如果我理解正确的话,AnimalArray是不同的,但Animal.prototypeArray.prototype是明显不同的。

在第2点中,我想解释为什么说Animal从Function"继承"是不正确的。

我希望这更有意义,谢谢大家

  1. 是的,您不能扩展Array,所以Array与您自己的函数有点不同
  2. 您可以说对象是从原型链上的原型中固有的,但不应该像在基于类的语言中那样将其与继承混淆。关于原型和构造函数的更多信息,可以在这里找到

注2:使用Animal构造函数创建的实例在原型链上没有Function,但Animal构造器本身在原型链中有Function:

function Animal() {}
var a = new Animal();
console.log(a instanceof Function);//false
console.log(a instanceof Object);//true
console.log(Animal instanceof Function);//true
console.log(Animal instanceof Object);//true
var noProt = Object.create(null);
console.log(noProt instanceof Object);//false
console.log(noProt.hasOwnProperty);//undefined

除了使用传递null作为第一个参数的object.create外,所有对象实例(包括Function)的原型链中都有object。对我来说,这就像是将window.undefine设置为window.undedefine以外的值,假设JS中的每个变量值都是一个对象,当有人做这样的事情时,就会跳出窗口。

  1. 正确-它们都有一个原型,尽管每个原型的不同

  2. 所有函数都是Javascript中的对象(参见下面的示例)

试试这些来证实你的信念。。。

alert(Function instanceof Object); // true
alert(Object instanceof Function); // true
alert(Array instanceof Object); // true
alert(Object instanceof Array); // false
alert(RegExp instanceof Function); // true
alert(Function instanceof RegExp); // false

这篇文章帮助我理解了javascript原型,这就是继承在javascript中的工作原理。

http://net.tutsplus.com/tutorials/javascript-ajax/prototypes-in-javascript-what-you-need-to-know/