为什么允许JavaScript函数对象与字符串到值映射格式不同?

时间:2015-10-07 17:39:56

标签: javascript javascript-objects

在JavaScript中,对象具有属性和值:

var o = {
    prop1: "value",
    prop2: 3
}

我的理解是所有JavaScript对象必须看起来像这样(即只有属性和值)。但是,函数(我不是在谈论方法)也是对象:

function f() {
    console.log("Hello");
}

为什么我的函数对象可能与{property:value}的{​​{1}}对象样式不同?

更新:尝试进一步解释我的问题:

对象几乎在我曾经读过的每本书中都被描述为字符串到值映射。例如,他们将属性名称映射到属性值:

o

函数是对象,但它们看起来并不像字符串到值映射:

{
    property1: value,
    property2: value
}

为什么允许函数对象与字符串到值映射格式不同?

5 个答案:

答案 0 :(得分:0)

好吧,在javascript中,functions可以在其他面向对象的语言中被视为Classes

这意味着您可以使用new关键字

从函数中实例化新对象

示例

function myFunc(){
   //Some code goes here
}

var myObj = new myFunc();

您可以使用this关键字

将属性附加到此类

示例:

function myFunc(){
    //this is a public property for any myFunc object
    this.name="My_Name";

    //this is a private property
    var age = 22;
}

var myObj = new myFunc();
console.log(myObj.name); //Will output "My_Name"
console.log(myObj.age); //undefined

答案 1 :(得分:0)

JS中的一切都是对象。

var o = {
    prop1: "value",
    prop2: 3
}

只是对象创建的快捷方式,而不是使用Object构造函数(也很快)。功能也一样。 考虑

var adder = new Function('a', 'b', 'return a + b'); console.log(adder.prototype)

它是一个带有构造函数的对象和具有相应值的其他属性。

答案 2 :(得分:0)

在用一种奇怪的表情看了你的问题5分钟后,我想我终于理解了你想知道的事情。

事实上,您在使用函数或键时,为什么javascript中Object的一致性是不同的:value类型的选项。

嗯,javascript是

  

具有一流功能的动态,弱类型,基于原型的语言

如果我可以在这里引用维基百科。

这意味着这个所谓语言中的所有东西都是Object base,如果你从例子中知道c#,它就像object类型一样,并且没有任何其他原始类型的对象。

话虽如此,对象主要是一个内存条目而不是真正的东西,不像int,string,char等。

因此,函数实际上与对象一样存储在内存中。 如果你看看其他精英类型的语言,你可以看到那个对象可以存储所有东西,甚至整个解决方案,它没有任何界限。

在无关紧要的事情上,我建议你阅读有关“拳击”和“拆箱”元素的内容,以了解客体化背后的想法。

  

为什么允许函数对象与字符串到值映射格式不同?

正是因为它只是一个内存引用而且“语法”并不重要,如果你尝试执行属于某个方法的某些操作而不是像{key: "value"}这样的普通类型对象,则执行将首先执行接近内存中的对象并尝试对其进行操作(),除非为此对象定义了()操作,否则它将抛出错误。

希望我自己说清楚

修改

好吧,生病了解更多,如你所愿。 基本上有两种方式可以进行数据存储。

  1. 堆内存(不是数据结构),如果再次引用Wikipedia是
  2.   

    非常简单的解释是堆是动态分配的内存所在的内存部分

    简单来说,这意味着您可以通过其价值来保存某些东西,并以不同的方式使用它作为价值。

    所以你问问自己,“不是靠价值”是什么意思

    1. 内存引用(堆栈),这意味着您创建的每个非基本对象都分配有自己的内存地址,实际上每次创建一个对象时,您在内存中分配空间,只是为了清楚,所有javascript的数据存储是通过这种方式完成的,不像任何精英类型的语言,如java,c,c ++,c#等等。 现在,我为什么这么说? 因为当我创建一个对象,一个引用,我可以创建对我想要的任何引用,它可以是一个描述人类,功能,文档甚至文件的对象。我将非常小心即将发表的内容,javascript不会让你在对象之间区分,对象是一个对象,当然每个对象都有自己的属性,但这只有在你尝试用该对象执行时才很重要。 / LI>

      如果你熟悉c#(因为它通常是广泛传播的语言,总是提起这个),你会注意到你有两个你创建的对象,方法,线程,任务,解决方案以及可能的每种类型的数据,以及它们本身就是对象。

      总结: javascript中的对象是原则问题,而不是数据类型。

      鼓励您强烈阅读文章heap vs stack

答案 3 :(得分:0)

我认为您所询问的内容是function declarationfunction expression之间的区别。这些只是Javascript允许创建Function类型的变量/属性的不同方式。

当然,您可以将函数定义为属性的内联值,就像任何对象文字一样:

var Foo = {
  bar: function(){
    console.log("bar");
  }
};

您也可以通过这种方式定义属性:

var Foo = {};
Foo.bar = function(){
  console.log("bar");
};

或者您可以将函数表达式的结果直接赋值给变量:

var bar = function(){
  console.log("bar");
};

这些示例应该证明函数与Javascript中的任何其他变量/属性一样。它们有一个类型,就像String或Number一样。字符串也是一个对象,但您不需要花括号来创建字符串:

var foo = "foo";

函数声明,正如您在问题中描述的那样,定义函数的方式略有不同:

function bar(){
  console.log("bar");
}

我认为他们在语言中包含了这种额外的函数语法,原因主要有一个:hoisting

包括提升函数声明的替代语法" up above"其他表达式允许编码器在它们定义变量和函数的顺序上稍微宽松一些。

有些论据都支持函数声明和函数表达式,但我倾向于使用函数表达式语法,因为我喜欢它对新团队成员来说更加一致并且不那么令人惊讶。

更新:

也许你正在过度思考这个想法"对象几乎在我曾读过的所有书中都被描述为字符串到价值图。例如,他们将属性名称映射到属性值:"

字符串是Object,函数也是Object。试试这个:

var foo = "foo";
foo.bar = "bar";
console.log(foo, foo.bar);

或者这个:

var foo = function(){
  console.log("foo");
};
foo.bar = function(){
  console.log("bar");
};
console.log(foo(), foo.bar());

在Javascript中创建对象文字的语法可能涉及定义键/值对,是的。但是有很多方法可以创建各种类型的变量和属性,其中许多最终都继承自Object原型,包括Function类型。

不同的语法都会导致创建相同类型的对象。唯一重要的是声明/执行的顺序,如提升规则所定义。

答案 4 :(得分:0)

在对自己做了一点研究之后,我发现函数对象是一种特殊类型的对象。除了是具有任意数量的属性和值的常规对象之外,函数对象也是可调用的代码块。这种额外的“能力”(我想不出更好的术语)是由JavaScript本身添加的。