我正在阅读此链接JavaScript_syntax
这似乎是循环的 - 每个函数都是一个Object,每个Object本身都是一个函数。哪个是原子的?有人可以用更好的方式解释吗?
答案 0 :(得分:51)
任何非基本类型(undefined,null,number,string,boolean)都是JavaScript中的对象(或实例)。这意味着function
继承自object
。
对象实例可以包含更多可以是函数的实例。这就是我们所说的“方法”(因为它有一个自动this
变量)。
由于您无法“调用”每个Object实例,因此并非每个对象都是函数。
答案 1 :(得分:15)
我认为这个概念经常被误解。
可视化JS类型关系http://jstype.herokuapp.com/#/home
的实用程序
var foo = { };
var foo = [1, 2, 3];
var foo = function abc() { return "hello world"; };
var foo = new Number(30);
var foo = new String("Hello World");
var foo = new Boolean(true);
var foo = new RegExp(/[foo]+/);
// All 'foo` are object.
所有原始类型都有相应的构造函数 wiz。 Array, Number, String, Boolean, RegExp
。由于所有函数都是对象,因此它们也是对象。所以我们可以称它们为构造函数对象。
大多数非原始类型都具有prototype
属性,其中所有继承的东西都存在。数学没有原型。
所有对象都继承自Object.prototype
的{{1}}
null
所有本机函数都继承自从Object.prototype继承的Function.prototype
object <- Object.prototype <- null
数组继承自function <- Function.prototype <- Object.prototype <- null
继承的Array.prototype
Object.prototype
必须阅读MDN: Inheritance and prototype chain
弄糊涂Stackoverflow: prototype in JavaScript
Stack Overflow: Function prototype explained
答案 2 :(得分:8)
每个功能都是一个对象。对象可以包含函数(方法),但对象不是函数。
答案 3 :(得分:6)
此外Function
始终是object
的属性。
这意味着JavaScript中的所有函数始终绑定到对象。如果你没有指定一个对象将一个函数绑定到它绑定到window对象(也称为全局函数)
..弗雷德里克
答案 4 :(得分:3)
最好说在JavaScript中,所有东西都可以被视为一个对象,包括原始类型和函数类型; JavaScript解释器的作用是,当您与它们交互时,它会自动将您的基元和函数提升为它们的对象包装类型。
还有一个Function对象,JavaScript中其他基元的许多等效Wrappers,这意味着您甚至可以在函数实例上调用方法,例如:
myFunction(someArg).call(this)
话虽如此,并非每个对象实际上都是一个功能。
答案 5 :(得分:3)
正如其他人所说,函数是可以像其他js对象一样通过引用传递的对象。并非所有对象都是函数,只有那些声明为对象的函数。
您经常会看到如此声明的方法:
var myFunc = function(foo, bar) {
...
};
这是为了强化mthod是一个函数对象,因此它是定义它的对象的属性,就像你可能用var
定义的任何其他变量一样。
这是javascript中最重要的功能closure.
的基础答案 6 :(得分:1)
每个函数都是一个Object。
我不是javascript专家,但我看不出每个Object是一个函数。 (我可以看到每个对象如何一个函数,但那是不同的)
答案 7 :(得分:1)
引自Working with Objects - MDN Docs
第Using Object Initializers节最后一段:
“在JavaScript 1.1及更早版本中,您不能使用对象初始值设定项。您只能使用构造函数或使用其他对象提供的函数来创建对象。请参阅Using a Constructor Function。”
意味着所有对象都在运行!具体而言,在评估,实例或实例化时。
从字面上看,该年份的所有对象都是在语法上用以下结构创建的:
"newobj = new constructFunctor(arg1,arg2){this.prop1=arg1 /* etc */}(val1,val2)"
在使对象为“newobj
”的字符串中,有一个单词“constructFunctor
”,即函数的名称。故意引用该陈述是为了打动这样一个事实:必须eval()
才能执行。在执行之前,“newobj
”被“等同于”一个函数,因为语句必须有一个,而“是”一个凭借“constructFunctor
”的字面存在来定义newobj
'执行时的价值。引用,而不是,非常有意,以阐明这种抽象。但是,因为JavaScript DOES具有eval
函数,所以这种抽象实际上是有意地合并到JavaScript语言中。
这仍然是JavaScript的基础,尽管一些语法快捷方式已被添加为“对象初始化器”,使用简写符号如“no={}
”。由于上述原因,上面引用的段落仍然存在于当前文档中。
此外,JavaScript还举例说明了函数式编程的基本范例。这使用递归函数理论和Lambda微积分的抽象将所有东西定义为函数!例如0(),1(),2(),...是常数的非元函数,更好地称为0,1,2,3,......
JavaScript与函数式编程风格方法完全一致,而不是常见的OOPS(双关语面向对象编程风格)。
答案 8 :(得分:1)
只是为了补充Aaron Digulla的答案。 在javascript中并非每个对象都是函数。但是Object,Array,String和许多其他内置对象是与new运算符一起使用来创建对象的函数。我认为这让大多数人感到困惑。
答案 9 :(得分:1)
javascript一切都是哈希表。 Ryan Dahl在他的一次会谈中这样说。那就是json也是;哈希表定义。这就是为什么你可以使用数组表示法或对象属性表示法访问对象。哈希表的值也可以是一个函数,它是一个哈希表。或者说是一个关联数组 在控制台中键入对象你得到{[native code]}这是一个哈希表
答案 10 :(得分:1)
Object是给予类的抽象数据,该类被分配给对象。对象可以具有属性,属性可以包含值和函数。 或者只是为了使其易于理解,您可以说任何非原始数据类型(数字,字符串,布尔值,未定义和未定义)都可以归类为对象。
答案 11 :(得分:-1)
所选答案错误。在JavaScript中,除了基本类型之外,一切都是函数。对象本身是一个被称为函数Object()的函数。例如,使用以下代码:
<script>
alert(Object);
</script>
答案 12 :(得分:-1)
Aaron Digulla所选择的答案并非100%正确,因为它说,
任何不是原始类型的东西(undefined,null,number, string ,boolean)是一个对象。
但字符串是一个对象。这就是为什么你可以做的事情:
myString="Hello World";
x = myString.length;
newString = myString.toUpperCase();
link = myString.link("http://www.hello-world.com/");
许多其他方法可以应用于字符串对象。
您还可以初始化字符串,如:
myString = new String("Hello, World!");
但是因为字符串也是一种数据类型,所以只需应用一个值就可以更容易地初始化它。
不一定是问题的答案......只是澄清/纠正Aaron Digulla的答案。