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"

你有何感想?

好了,就写到这吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容

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