javascript 犀牛书 随笔(二)

 风和日丽,小枘坐在电脑前,旁边放了一杯清茶

 好一个下午,敲着代码,人生啊。

突然,一阵钥匙的声音打破了平静,是妈妈醒言回来了。

“吃了吗”

“没“

“那叫个外卖”

“哦”

小枘点了外卖,继续去电脑旁边了。这时醒言打开音响,去洗澡了。

“妈 我学习呢 你声音小点”

“这是我家”

小枘心里一沉

外卖来了,醒言洗完了澡

小枘打开了饭盒,埋头吃着

想着每天晚上 醒言和爸爸的电视电影重低音炮 没的商量 小枘很失望

吃完了 小枘放下一句

“你们从来不关心我的学习”

拎着包 跑出去了

外面风越刮越大,小枘走在路上,眼睛有些湿润。不知不觉间来到了学校偌大的操场旁,天色有些黑了,她仿佛看到一个黑色的影子从台阶那边飘过来,又消失不见。

小枘坐在篮球架下,靠着柱子,昏昏欲睡

恍惚间她好像来到了一个巨大的糖葫芦下面,每一颗的颜色都不同,很好看,她闻了闻,最底下的果仁是核桃的,她顺着这个链往上爬,这个是草莓核的,这个是苹果核的...到顶了,只见js先生正在竹签顶旁,手里拿着一个null往上面插着。

R擦擦眼睛:这是你做的?

J神秘的:糖葫芦可不给爱哭的小孩吃,啊不,你都这么大了,应该是爱哭的妇女吃。

R恍然大悟:我知道了,这就是书上说的原型链!原来长这样,哈哈。

J:拜托,给你爸爸留一点尊严好吗,这里面道行不浅

R:刚才我只不过是从一个子类往父类做查询罢了,真正的继承就体现在这个“查”操作里

J:没错,是这样的,但是修改属性也很重要啊,你猜猜我会怎么看o.x=1这样的事?

R:嗯 首先要看有没有这个x属性,像我刚才那样找一下,如果没有,那就创建一个,这个是js的特点

J坏笑到:那要是有呢

R:有,那就有呗,赋值成功!。。啊 不不不,好像还有一种情况是只读属性,这时大概要赋值失败咯

J:嗯 不错 只不过。。

R:?

M:好吧 年轻人,告诉你吧,实际上还有一种属性存在的,而这个属性是一个具有setter方法的属性,那么子类对象。。

R:会调用setter方法!

J:嗯 孺子可教也 我们后面还会深入的看这种情况

R(有点不开心的):  今天我的事,你知道了?

J:哈哈 我就是你肚子里的梦 怎么会不知道?每个人都会犯错,何况是在家庭里的事,说不上谁对谁错。别想那些事了,没个结尾的。

R:哈哈 谁不犯错呢。

(突然想起来了什么):那我给你出一道题,如果访问属性出错了怎么办?

J:什么叫访问属性出错?

R:嗯 打个比方 我这样book.subtitle去访问一个属性,但实际上book没有这个属性,怎么办

J:这不能算错,我会返回一个undefined

R:那要是我继续质疑访问 book.subtitle.length呢

J:那就相当于访问undefined的属性,这就不行了,这样会报错呢。你快帮我想想,怎么样防止出现这样的情况!

R:不如这样 var len=book && book.subtitle && book.subtitle.length

J: 呦,写的挺高级,我还等着你写

if(book){

   if(book.subtitle){

       len=book.subtitle.length

}},然后顺其自然的嘲笑一下 :)

R: 骇,现在的年轻人,了解个&&很难么(666),这里我借用了它的短路行为呢

J(机智而得意的):哎呀 真棒棒呢 那小爷问你 我想要删除一个属性可怎么办呢

R(思考了一下没有结果,连忙偷偷百度):啊 删除 不就是delete关键字嘛 就这样delete book.author就好拉

J:哎呦 百出来了吗我的儿? 不如我们来做一个猜猜看的游戏~

R:啊 听起来就很无聊 好吧 放马过来

J:你猜我在设计语言的时候会不会让你“一删到底”?

比如

a={

p:{x:1}

}, 假设还有b=a.p, 现在我delete a.p,请问我回过头去访问b.x还有戏吗? 

R:嗯 你都这么问了 看来还是可以取到值的 (这真是一个考验情商的时刻),(不屑的)上面的栗子有点不严谨啊

J:哦? 你敢dis老师?说下去!

R:会造成内存泄漏嘛,没办法,以后要销毁对象的时候要遍历属性中的属性,依次删除咯

J(有点满意的):嗯额。好吧。那我再问你,如果换做是你,怎么处理继承属性的删除?

R:恩。。(换做是我?下辈子吧哥)刚才都是“分段式”的删除,这一次肯定不会好到哪里

J(小孩还算上道):嗯 差不多巴 也不是完全一样

R:?

J(秀一波专业术语的时间到了)delete运算符只能删除自自有属性,不能删除继承属性,

R:和我说的一个意思

J:要删除继承属性必须从定义这个属性的原型对象上删除它  (重点来了)而且这会影响到所有继承自这个原型的对象

R:哦 原来雷点在最后啊

R(生来挑衅的):但是仔细想想,那个delete怎么着也得有个返回值吧,是true还是false啊

J:看来你已经看出我打算让它返回一个boolean值咯

R:嗯哈 我都帮你想好了 比方说o={x:1};如果delete o.x,那么会成功的,那么就返回true,如果程序猿后面再delete o.x一次也不算错,就当是什么也不做,继续返回true。最后一种情况就是,(想到了刚学会的继承),因为o这种创建对象的方式会继承object属性toString,所以呢,呵呵,按照上面的规则,你尝试删除delete o.toString, 实际上还是什么也不做(刚才讨论了不删继承属性的问题),所以上述三种情况都返回true。

J:嗯 逻辑看似清楚。

R:看似?

J:有本事分析一下false的情况?

R:...不好说 我猜delete object.prototype 是不合适的 因为。。它的prototype属性可配置性为false

J:嗯 原则没错。某些内置对象的属性可配置性为false,比如变量声明和函数声明创建的全局对象的属性

R:啊 那不就是 var x=1 和 function f(){} 吗,也就是说我delete this.x 、delete this.f都会像deleteobject.prototype一样,返回false咯?

J:嗯 是滴

R(一颗躁动的心促使它又一次dis JS先生):哦 不过。。我看到this.x=1; delete x就返回true了啊?

J:呃(小屁孩),对啊,因为前面this.x是创建了一个可配置的全局属性呢,人家又没有用var。

R(too young too naive?no no no 继续dis):ok,那上次隔壁小王就是这么写的,为什么报出语法错误了呢?

J:(遇强则强的老姜头):噢 那是在严格模式下了,这时候就不能简写了,必须写delete this.x拉。

R(表示服气):说了这么多,我该回家了

J:年轻人 要多读书呢 (别一天到晚dis我)

R:拜拜啦(dis 你还不是因为喜欢你吗)

旁边:(土味情话完美收尾,小枘回到家,满脑子的访问属性、错误处理、删除属性,又想到今天的糖葫芦,开心的睡着了)

猜你喜欢

转载自www.cnblogs.com/NinjaRose/p/9404220.html