JavaScript函数原型:对象,函数还是两者?

时间:2014-01-23 21:22:35

标签: javascript function object prototype

JavaScript函数原型链中的函数在哪里?

工作示例:在Chrome控制台中,我创建了以下功能:

> var f = function() { alert(1); }
使用f()

调用正确地产生了数字1的警报。在使用以下控制台语句检查函数时:

> console.dir(f)

注意原型如何以键/值对prototype: Object的形式列为Object,这意味着函数f直接从Object继承。很公平; JavaScript中的数组和其他实体也继承自Object。

冲突是由以下观察引起的。输入以下命令:

f instanceof Function

这会产生true

据我了解,用户创建的函数继承自Function对象,而Function对象又继承自Object;但是,对于我的生活,我通过检查f的原型链找不到它。

函数f的原型链中的Function在哪里?

tyvm

3 个答案:

答案 0 :(得分:1)

  

函数f的原型链中的函数在哪里?

Function本身不是,它是Function.prototype。它应该在函数f

的“下方”
         f
         |
         v
 Function.prototype
         |
         v
  Object.prototype
         |
         v
        null
  

注意原型如何以键/值对原型的形式列为Object:Object

您看到.prototype的{​​{1}}属性是函数自己的原型对象 - 假设f是构造函数,那么所有f实例都将继承自new f

  

意味着函数f直接从Object继承。

不。公共f.prototype属性不得与内部原型链混淆(通常表示为 [[prototype]] 内部属性)。您可以使用.prototype访问原型链。有关__proto__ VS. prototype in JavaScript的更多信息,可能是Why functions prototype is chained repeatedly?http://eloquentjavascript.net/chapter8.html

答案 1 :(得分:0)

我从一开始就为那些来这个帖子寻找信息的人开始。

kmiklas可以忽略所有内容,只是跳到最后的链接。任何不确定Javascript的人都应继续阅读下面的内容。

//开始时开始。

在JavaScript中,几乎所有东西都是一个对象。即使是原始数据类型(null和undefined除外)也可以视为对象。

布尔值可以是被视为对象的对象或原始数据 数字可以是被视为对象的对象或原始数据 字符串也是对象或原始数据,被视为对象 日期总是对象 数学和正则表达式始终是对象 数组总是对象 甚至函数也总是对象

JavaScript是一种面向对象的语言,但JavaScript不使用类。

在JavaScript中,您不定义类并从这些类创建对象(与大多数其他面向对象语言一样)。

JavaScript是基于原型的,而不是基于类的。

Javascript中的每个对象都有一个原型。当消息到达对象时,JavaScript将首先尝试在该对象中查找属性,如果找不到该属性,则消息将被发送到对象的原型,依此类推。这就像基于类的语言中的单父继承一样。

原型继承链可以随意使用。但总的来说,制作长链并不是一个好主意,因为你的代码很难理解和维护。

-------> More info on Prototypes and Javascript (VERY USEFUL!!!) <-------

答案 2 :(得分:0)

我认为你误解了javascript原型链。在控制台中试试这个:

function AnObject(){

}

AnObject.prototype = {
    aMethod: function() {
        return "hi";
    }
}

new AnObject().aMethod()现在返回“hi”。

您看到AnObject.prototype无法返回AnObject祖先:事实上,它意味着要在AnObject实例上复制方法。

AnObject.prototype现在返回

{
   aMethod: function() {
        return "hi";
   }
}

如果您想知道AnObject函数的类型,可以使用AnObject.constructor,然后获得function Function() { [native code] }