【问题标题】:Understanding of Javascript prototypal inheritanceJavascript原型继承的理解
【发布时间】:2013-12-06 21:08:53
【问题描述】:

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

function Animal() {
}

现在第一个问题:

  1. 我声明Function 对象。这与例如没有什么不同。 Array JS 自带的。 Array 也是 JS 原生提供的 Function 对象是吗? ObjectRegExp 和其他人也是如此吗?对吗?

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

非常感谢您对上述内容的澄清,干杯,

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

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

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

【问题讨论】:

  • blog.javascriptroom.com/2013/01/14/… 可能是一篇有用的文章。
  • 它是Function 的一个实例。语言为您的函数创建一种新类型的对象是没有意义的,因为它可能会产生开销并且比作为一个实例更有意义。

标签: javascript inheritance prototypal-inheritance


【解决方案1】:
  1. 是的,您不能扩展 Array,因此 Array 与您自己的函数有些不同。
  2. 您可以说对象从原型继承原型链,但您不应将其与基于类的语言中的继承混淆。更多关于原型和构造函数的信息可以在here找到。

注意 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

所有对象实例(包括函数)在其原型链中都有 Object,除非您使用 Object.create 传递 null 作为第一个参数。对我来说,这就像将 window.undefined 设置为 window.undefined 以外的值,因为假设 JS 中的每个变量值都是一个对象,当有人这样做时,它就会消失。

【讨论】:

  • 你的意思是扩展数组?如果我去 var a=new Array();它会给我基于 Array.prototype 的对象。另外,如果我做 var o={};o.__proto__=Array.prototype o 变成数组。你能解释一下你的意思吗
  • @spirytus 不能这样做:(复制和粘贴)构造函数不起作用var MyArr=function(){ Array.apply(arguments); }; MyArr.prototype=Object.create(Array.prototype); var my=new MyArr(1,2,3); console.log(my.length);//=0 my.push(4); console.log(my);//=[4] my.push(5); console.log(my.length);//=2
【解决方案2】:
  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/

【讨论】:

  • 这不是 OP 要求 imo 的。我想他是在问为什么调用 Array 的结果不是一个函数 - 一个好的答案应该可以解释这一点。
  • 我明白为什么调用 new Array 不会返回函数,这是因为 Array.prototype 实际上是一个对象(Array.prototype.__proto__===Object.prototype)。我现在更新了我的问题,我希望这会让它更清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2010-09-28
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多