JavaScript - 函数和对象

JavaScript 函数和对象

首先是一段独白,与正文无关,可直接跳过下面的段落。

接下来要聊的东西我还没有特别清晰的思路,不过考虑到我们都是“在路上”,所以没必要面面俱到。因此,我会把我了解的,平时用到的,都拿出来分享。但这些显然不是我们现在涉及的领域的全部,甚至可能不是主要的部分。不过,相信你并不会因此而苛责我吧,因为你毕竟不是在读一本专业书,带着挑剔的专业的眼光(_)。

函数与对象啥关系

在 JavaScript 中,很多东西都可以看做对象,不过就像咱们青年也分为:2B青年,普通青年与文艺青年一样,在这里请允许我冒昧地把 JavaScript 中的对象也分分类。当然,请注意,我保证这不会是官方的或者是学术上的分类。

在这里,我把 JavaScript 的对象分为:

  • 隐式对象:包括数值,字符串,数组。
  • 内置对象:由语法规范定义或由运行环境提供的一些对象,例如正则表达式、日期、HTMLElement 对象等等。
  • 普通对象:简单来说就是类似{ name: "luobo" }这样声明的一个对象。
  • 函数对象:其实就是函数,但同样也是对象,只不过有被“调用”的“大招”。

隐式对象

举个栗子:

var s = "Hello, luobo!";
s.substr(7, 5); // "luobo"

把这里的 s 看做对象,是因为它有“方法”啊!你说是不是很合理啊。当然,任何道理有时候都像是“强词夺理”,你懂得。

不过,我不把 new String("Hello, luobo"); 这样得到的对象归于此类哈,这个我归于下一类。

内置对象

就是在特定的运行环境中可以通过 new XXX() 这种方式得到的对象,或者通过一定的方法可以得到,但自己没法直接创建的东东(如 HTMLElement,没法自己通过 {...} 这样直接声明得到哦),当然,这个东东得像“对象”才行。

我所说的像“对象”,其实并无“深意”。所谓的对象还不就是一个能够保存数据,并且可选地提供了一些“方法”的东西嘛。(当然,你有权吐槽,欢迎)

普通对象

这是自己可以创造的,例如{ name: "luobo" }就得到了这样一个对象。或者通过某种方式(这里不多说,后面再讨论哈)基于自己的定义通过函数创造的对象,类似于:

function Person(name) {
    this.name = name;
}

var me = new Person("luobo");
me.name; // "luobo"

因为这个 Person 是自个整出来的,所以不能算是“内置”的是吧,毕竟咱们得讲道理不是。然后这个对象是和你创造它的预期相符的,你让它有啥属性、方法,它就得有不是。所以,这么老实听话的,就是“普通”对象啦。

函数对象

函数对象当然是通过这种方式定义的:

function HelloWorld() {
    console.log("Hello, world!");
}

这里的HelloWorld就是个函数,多简单。

当然,也可以这样定义函数:

function () {
    console.log("Hello, world!");
}

其实上面这个函数和上上面的那个其实一样。当然,如果你认真看的话,会发现它没有“名字”,然而这也就是没有名字而已,函数本身已经创建了,而且可以用了。只不过,没有名字所以用的时候不是那么的“直白”而已。你可以这样用:

(function () {
    console.log("Hello, world!");
})();

这样就调用了,是不是很....傻啊。其实我写过好多这样的代码,主要的目的不是为了定义这个函数,而是为了把东西放到这个函数内部执行。为啥这样呢?我以后讲。(当然,更推荐你自己看书了解啦)

函数

上面栗子中的 HelloWorld 只是个名字而已,你也可以把它作为一个“变量”,这个变量的“值”就是一个函数对象啦。所以,也可以这样来定义函数:

var HelloWorld = function () {
    console.log("Hello, world!");
}

据我了解,在一些编程语言中(对,包括Java),有“值”、“引用”的说法。在JavaScript中,不能说就完全没有这些东西,但是我在一些书和资料里很少看到专门讨论这些的。我想还是由于一些习惯,导致不那么看重这些吧。例如由于闭包的存在,就会出现一些奇妙的现象,这个我也放到后面的文章再说吧(嗯,待我再整理、积累下,毕竟闭包这种东西有些“高级”)。

还是来说函数,先说说函数可以被调用这件事吧。当然,这是显而易见的。

还是说上面的HelloWorld函数,可以这样调用:HelloWorld(),这是普通青年的做法。当然你也可以文艺些这样来:HelloWorld.call(),还是会输出结果的。但是这样用的话,你看待HelloWorld的视角就变了,这个时候,你就可以把它看作是一个对象,这个对象有一个方法call(),作用呢,就是调用你的这个函数,是不是完全不一样啦!

除了call(),还有apply()方法,也是可以用来调用函数的,它们的相似和不同之处,不在此展开了(欢迎查资料自己了解)。通过介绍call(),貌似我再说函数是一个对象时,就更容易理解了。当然,还有更让人“信服”的栗子:

HelloWorld.version = "v0.1";

嗯,这个函数还有版本啊,厉害。不对,这个家伙还可以设置属性!不仅如此:

HelloWorld.sayHello = function () {
    console.log("Hello!");
};

还可以定义方法呢。所以,它当然是个对象,不过是个可以被“调用”的对象。

举个实际中的栗子,我们在用 jQuery 的时候可能都写过类似的代码:

$('#myDiv').css('color', 'red');
$.ajax({ url: '/foo.jsp' });

有没有注意到,上面两行对 $ 的使用是不同的。第一行是直接调用$函数(对,$就是个函数),第二行则是调用$对象($也是个对象哦,因为函数都是对象嘛)的方法ajax。怎么样,是不是“茅塞顿开”?(当然你可能早就知道,不过我之前搞清楚这个的时候可是兴奋得很啊!)

函数生成对象

这是一个比较“高级”的话题啦(相对我来说,不是你哈),我不打算展开,因为想在后面讲 JavaScript 中的“继承”的时候再多说一些。先看个栗子:

function Person(name) {
    return {
        name: name
    };
}

这里定义的函数Person就可以生成对象,怎么样,很简单吧?

你不会打死我吧....

但是,当你看到这个的时候:

var me = new Person("luobo");
me.name; // "luobo"

你有何感想?

好了,就写到这吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数 定义函数 创建一个函数需要用到关键字function,后面是一个函数名 为函数提供0或多个参数,使用参数向函...
    刘涤生阅读 403评论 0 1
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,665评论 0 5
  • 她突然开口说:“我喜欢看小说,每天坚持着在做。你除了坚持在朋友圈发些文字,一直坚持的事还有什么”?我陷入沉思,...
    小小帅的随笔阅读 257评论 0 1
  • 傾夢之轩,煙光草冷,凉风起於檐鈴。萦怀所愛,相思海深,远韵生自朝歌。
    远韵阅读 187评论 0 0
  • 曾经听人说,只要倒立,眼泪就不会掉下来。现在看来这个说法不可信。眼泪这东西起码无法摆脱地球的引力。只不过它的路线有...
    4401f9fe32bc阅读 198评论 0 0