了解Javascript原型继承

时间:2013-12-06 21:08:53

标签: javascript inheritance prototypal-inheritance

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

function Animal() {
}

现在第一个问题:

  1. 我宣布Function个对象。这与例如没有区别。 JS附带的ArrayArray也是JS原生提供的Function对象,对吗? ObjectRegExp以及其他人也是如此吗?是吗?

  2. 说这个对象继承自Function是不正确的,但有人可以向我解释原因吗?这是因为在Java和其他语言中没有使用正式类吗?或者是因为Animal获取实际现有对象的属性而不是那种类在其他语言中的蓝图?还有其他原因吗?

  3. 对上述内容的澄清将非常感激,欢呼,

    编辑:我的问题似乎造成了混乱,所以我应该澄清一下。 在第1点,我不会问Array返回什么。我只是想确认我的理解,函数AnimalArray都有共同点,它们的[[Prototype]]属性引用相同的Function.prototype,因此两者都是{{1对象。如果我理解正确FunctionAnimal不同,则原因ArrayAnimal.prototype明显不同。

    在第2点,我正在寻找解释为什么说“动物”从“功能”继承“不正确”。

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

2 个答案:

答案 0 :(得分:0)

  1. 正确 - 所有人都有原型,虽然每个原型都不同

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

  3. 尝试这些以确认您的信仰......

    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/

答案 1 :(得分:0)

  1. 是的,你不能扩展Array,因此Array与你自己的函数有点不同。
  2. 您可以说对象从原型链中的原型继承,但您不应该像在基于类的语言中那样将它与继承混淆。有关原型和构造函数的更多信息,请参见here
  3. 注意2:使用Animal构造函数创建的实例没有原型链的功能,但Animal构造函数本身确实具有Function up它的原型链:

    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
    

    所有对象实例(包括Function)在其原型链中都有Object,除非您使用Object.create传递null作为第一个参数。对我来说,这就像将window.undefined设置为window.undefined之外的值,假设JS中的每个变量值都是某个对象执行此类操作时窗口外的对象。