首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JavaScript函数原型:对象、函数还是两者兼而有之?

JavaScript函数原型:对象、函数还是两者兼而有之?
EN

Stack Overflow用户
提问于 2014-01-23 21:22:34
回答 3查看 285关注 0票数 3

函数在JavaScript函数的原型链中的位置?

工作示例:在Chrome的控制台中,我创建了以下函数:

代码语言:javascript
运行
复制
> var f = function() { alert(1); }

使用f()的调用正确地导致了数字1的警报。在使用以下控制台语句检查函数时:

代码语言:javascript
运行
复制
> console.dir(f)

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

冲突产生于以下观察。输入以下命令:

代码语言:javascript
运行
复制
f instanceof Function

这导致了true

据我所知,用户创建的函数继承了函数对象,而函数对象又继承了对象;然而,对于我的生活,我无法通过检查f的原型链来找到它。

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

泰文

EN

回答 3

Stack Overflow用户

发布于 2014-01-23 21:30:00

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

Function本身不是,而是Function.prototype。它应该就在“下面”函数f

代码语言:javascript
运行
复制
         f
         |
         v
 Function.prototype
         |
         v
  Object.prototype
         |
         v
        null

注意原型是如何以键/值对prototype: Object的形式作为对象列出的

您所看到的ff属性是该函数自己的prototype对象-假设f是一个构造函数,那么所有new f实例都将从f.prototype继承。

这意味着函数f直接从对象继承。

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

票数 1
EN

Stack Overflow用户

发布于 2014-01-23 21:41:32

我是从一开始的人谁来这个帖子寻找信息。

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

//从一开始开始。

在JavaScript中,几乎所有东西都是一个对象。即使是原始数据类型(除了null和未定义的数据类型)也可以作为对象来处理。

布尔值可以是对象,也可以是原始数据,数字可以是对象,也可以是原始数据,字符串也可以是对象,或者原始数据也可以处理为对象,日期总是对象,数学和正则表达式总是对象,数组总是对象,函数总是对象。

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

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

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

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

原型继承链可以维持您想要的时间。但是一般来说,制造长链并不是一个好主意,因为您的代码很难理解和维护。

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

票数 0
EN

Stack Overflow用户

发布于 2014-01-23 21:42:33

我想你误解了javascript原型链。在控制台中试一试:

代码语言:javascript
运行
复制
function AnObject(){

}

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

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

您可以看到,AnObject.prototype无法返回AnObject祖先:实际上,它意味着要用要在AnObject实例上复制的方法覆盖它。

AnObject.prototype现在回来了

代码语言:javascript
运行
复制
{
   aMethod: function() {
        return "hi";
   }
}

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21319594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档