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
答案 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] }