js語言精粹之對(duì)象+閉包+函數(shù) 1

2018年7月27日15:16:58

對(duì)象

檢索一個(gè)并不存在的成員的屬性 將返回undefined

  • JavaScript語言精粹
    從上到下順序執(zhí)行
    如果想調(diào)整執(zhí)行順序 考條件 循環(huán) return break 函數(shù)調(diào)用 來改變執(zhí)順序
    false null undefined '' 0 NaN => flase
    除了數(shù)字 字符串 布爾值 undefined null
    其余所有東西都是對(duì)象

更新 obj['a'] = a
if a 在obj對(duì)象里 被替換
if a 不在~~~~~ 就添加該屬性

原型

var stooge = {
    "first-name":'asdf',
    "last-name":"qwer",
    waihao:"sucker"
}
    // Object.create = function (o){
    //     var F = function(){}
    //     F.prototype = o
    //     return new F()
    // }
var an_stooge = Object.create(stooge);
an_stooge['first-name'] = "aili"
an_stooge['last-name'] = "ablitip"
an_stooge.waihao = '麗麗'

/* 給stooge 加個(gè)新屬性 */
stooge.age = "20"
console.log(an_stooge);

// 如果 獨(dú)有屬性 hasOwnProperty('number')
console.log(stooge.hasOwnProperty('age '));    //true


/*** 枚舉 對(duì)象的屬性 for in
 */
var age _length;
for(age _length in an_stooge){
    if(typeof an_stooge.age !=='function') document.writeln(age _length+':'+an_stooge.age)
}

減少全局變量污染

// 減少全局變量污染
//創(chuàng)建一個(gè)應(yīng)用的唯一一個(gè)全局變量 這是最好的
var app = {};
//然后就可以定義你說定義的一切變量而不會(huì)污染全局變量
//避免與其他函數(shù)庫或者框架發(fā)生沖突 也易讀
//閉包是另一種有效減少全局污染的方法

app.stooge = {
    "first-name":"app",
    "last-name":"fuck off"
}
app.say = function(){alert("hello i'm an app!")}

函數(shù)(Function)

所謂編程,就是將一組需求分解成一組函數(shù)與數(shù)據(jù)結(jié)構(gòu)的技能 也就是說
編程能力的高低取決于你理解需求并組織成函數(shù)和數(shù)據(jù)結(jié)構(gòu)的能力

函數(shù)對(duì)象
每個(gè)函數(shù)創(chuàng)建時(shí)都會(huì)有兩個(gè)屬性 contxt上下文和"調(diào)用"屬性 當(dāng)函數(shù)被調(diào)用時(shí) 可以理解為調(diào)用了此函數(shù)的調(diào)用屬性

所以在js里都是對(duì)象
函數(shù)可以保存在變量對(duì)象和數(shù)組 當(dāng)做參數(shù)傳給其他函數(shù) 函數(shù)在返回函數(shù)

因?yàn)楹瘮?shù)也是對(duì)象 所以函數(shù)也可以擁有方法

函數(shù)字面量

var add = function(a,b){
    return a+b
}

內(nèi)部函數(shù)可以訪問自己參數(shù)和變量 同時(shí)可以訪問把它嵌套在其中的父函數(shù)的參數(shù)與變量 通過函數(shù)字面量創(chuàng)建的函數(shù)對(duì)象包含一個(gè)連接到外部上下文的連接。 就稱為 閉包 js強(qiáng)大表現(xiàn)力的來源

調(diào)用
每個(gè)函數(shù)接收兩個(gè)附加參數(shù) arguments this
this在 OO 編程中非常重要 this取決于調(diào)用的模式
js調(diào)用模式有四種方式
1.方法調(diào)用 this=>對(duì)象.

var app = {
    "first-name":"app",
    "last-name":"fuck off",
    say:function(){alert("hello i'm an app!")}
}

2.函數(shù)調(diào)用 this=>全局 這是語言設(shè)計(jì)上一個(gè)失誤

var say = function(){alert("hello i'm an app!")}

所以我們才會(huì)使用

var that = this

3.構(gòu)造器調(diào)用 this=>構(gòu)造函數(shù)的實(shí)例.
js是一門基于原型繼承的語言 對(duì)象可以直接從其他對(duì)象繼承屬性

var Que = function(str){
    this.name = str
}
Que.prototype.get_name = function(){
    return this.name;
}
var newQue = new Que("Aili")
console.log(newQue)

4.apply調(diào)用
js是一門函數(shù)式的面向?qū)ο缶幊陶Z言 所以函數(shù)可以擁有方法

1.
var arr = [2,3]
var sum = add.apply(null,arr)
console.log(sum);
function add(a,b){
    return a+b;
}

2.
var Que = function(str){
    this.name = str
}
Que.prototype.get_name = function(){
    return this.name;
}
var test_que = {
    name:'asdf'
}
var name_a = Que.prototype.get_name.apply(test_que)
console.log(name_a)

test_a 并沒有g(shù)et_name方法也沒有繼承Que的方法 但是可以通過apply調(diào)用

拓展函數(shù)

Function.prototype.asd = function(name,func){
    if(!this.prototype[name]) this.prototype[name] = func
    return this
}

Number.asd('what_on',function(){
    return Math[this<0?'ceil':'floor'](this)
})
console.log((-10/3).what_on())

// 去掉字符串引號(hào)
String.asd('rid',function(){
    return this.replace(/^\s+|\s+$/g,'')
})
console.log(("asdfasdf").rid());

7月30日

09:31:55 今天繼續(xù) 周末是因?yàn)樗绞虑覜]有筆記本耽誤了兩天 很氣但可以補(bǔ) 加油加油

閉包

作用域的好處是內(nèi)部函數(shù)可以訪問定義它們的外部函數(shù)的參數(shù)和變量
內(nèi)部函數(shù)擁有比外部函數(shù)更長(zhǎng)的生命周期
調(diào)用函數(shù)完成初始化 返回一個(gè)對(duì)象字面量

var myObject = (function(){
    var value =0
    return {
        increment:function(inc){
            value +=typeof inc === 'number'?inc:1
        },
        getValue:function(){
            return value
        }
    }
}());

這里的value只對(duì)內(nèi)部函數(shù)可用 一開始并沒有賦值給myobject 是把函數(shù)返回的結(jié)果賦給它 而且最最最重要的
內(nèi)部函數(shù)將繼續(xù)享有訪問內(nèi)部value的特權(quán)
之前寫過的Que 可以用閉包再去寫一遍

這里的name不是私有屬性 可以直接訪問到  如果name 是私有屬性怎么處理 `閉包`
var Que = function(str){
    this.name = str
}
Que.prototype.get_name = function(){
    return this.name;
}
var test_que = {
    name:'asdf'
}
var name_a = Que.prototype.get_name.apply(test_que)



var Que = function(name){
    return {
        get_name:function(){
            return name
        }
    }
}
var aili = Que("aili")
console.log(aili.get_name());


//如果第一個(gè)不夠 第二個(gè)例子繼續(xù)
function getA() {
   var a = 'xxx';
   var c, d;

   function b() {}
   //...
   function fnA() {
     b();
     console.log(a);
     //???
   }

   return fnA;
}

var fnA = getA(); 

Que返回了 但是內(nèi)部函數(shù)get_name還是可以訪問 Que的name屬性 get_name可以訪問它被創(chuàng)建時(shí)所處的上下文環(huán)境=>閉包

fnA就有了自己的獨(dú)立作用域趣避,不需要擔(dān)心getA函數(shù)執(zhí)行之后晕窑,作用域會(huì)銷毀的問題

下面這例子是很多面試中都會(huì)提到de 是想給每個(gè)處理器一個(gè)唯一值 i func只是綁定了 i 本身 而是不是 i 的值

var asd = function(nodes){
    var i;
    for(i = 0;i<nodes.length;i++){
        nodes[i].onclick = function(e){
            alert(i)
        }
    }
}

改良后

var asd = function(nodes){
    var i;
    for(i = 0;i<nodes.length;i++){
        node[i].onclick = (function(i){
            return function(e){
                alert(i)
            }
        }())
    }
}

閉包的部分 我準(zhǔn)備看另一個(gè)書 youdontknowjs這本書講的有點(diǎn)籠統(tǒng)
阮一峰大神的閉包

  function f1(){

    var n=999;

    function f2(){
      return n
    }

    return f2;

  }

  var result=f1();

  var aa = result(); //this.aa 999
       //內(nèi)部函數(shù)變量被傳到外部 或者可以理解為外部函數(shù)可以引用內(nèi)部函數(shù)的變量了

模塊

使用閉包和函數(shù)創(chuàng)造模塊 提供接口卻隱藏狀態(tài)與實(shí)現(xiàn)的函數(shù)或者對(duì)象 通過函數(shù)產(chǎn)生模塊 可以幾乎摒棄全局變量的使用
在函數(shù)內(nèi)部創(chuàng)建的變量每次執(zhí)行 變量就會(huì)被求值一次 理想的方式是把它放入一個(gè)閉包里 而且還能提供一個(gè)增加更多拓展方法

String.asd('zifu_dentify',function(){
    var entity = {
        quot:'"',
        lt:'<',
        gt:'>'
    }

    return function(){
        return this.replace(/&([^&;]+);/g,
        function(a,b){
            var r = entity[b]
            return typeof r === 'string'? r:a;
        })
    }
}())

console.log('&lt;&quot;&gt;'.zifu_dentify());   //<">

模塊模式 函數(shù)作用域+閉包 創(chuàng)建被綁定對(duì)象和私有成員的關(guān)聯(lián)
封裝或者構(gòu)造其他單例對(duì)象(單例模式:就是用對(duì)象字面量創(chuàng)建的對(duì)象)
設(shè)計(jì)模式還是得看且思考

下面這個(gè)例子更好理解 創(chuàng)建車牌號(hào)(類似于北京的搖號(hào))

var serial_maker = function(){
    var prefix = ''
    var seq = 0
    return {
        set_prefix:function(p){
            prefix = String(p)
        },
        set_seq:function(s){
            seq = s
        },
        gensym:function(){
            var result = prefix+seq
            return result
        }
    }
}

var seqer = serial_maker()
seqer.set_prefix('新A')
seqer.set_seq(Math.floor((Math.random()*100000)))

var unique = seqer.gensym()
console.log(unique);  // 新A14770

神奇的是 這里并沒有this that 除非調(diào)用對(duì)應(yīng)的方法 不然沒法改變prefix seq

級(jí)聯(lián)
修改狀態(tài)不用返回任何值得方法 類似Jquery 返回this

$().move().click().width().html()......

柯里化
函數(shù)與參數(shù)結(jié)合 產(chǎn)生出新的函數(shù)

繼承

人們往往會(huì)把一件完整的東西化成無數(shù)的形象诲锹。就像凹凸鏡一般古劲,從正面望去肴敛,只見一片模糊艾君。
18:17:35 今天書就看到這里 明天繼續(xù)
其實(shí)看到這兒這篇Blog就算結(jié)束了 繼續(xù)的篇章在js語言精粹之繼承+數(shù)組 2 可以繼續(xù)跟進(jìn)查看


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末采够,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子冰垄,更是在濱河造成了極大的恐慌蹬癌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虹茶,死亡現(xiàn)場(chǎng)離奇詭異逝薪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝴罪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門董济,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人要门,你說我怎么就攤上這事虏肾。” “怎么了?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)积仗。 經(jīng)常有香客問我咳胃,道長(zhǎng),這世上最難降的妖魔是什么伪阶? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上藻雌,老公的妹妹穿的比我還像新娘。我一直安慰自己斩个,他們只是感情好胯杭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著受啥,像睡著了一般做个。 火紅的嫁衣襯著肌膚如雪鸽心。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天居暖,我揣著相機(jī)與錄音顽频,去河邊找鬼。 笑死太闺,一個(gè)胖子當(dāng)著我的面吹牛糯景,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播省骂,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼蟀淮,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了钞澳?” 一聲冷哼從身側(cè)響起怠惶,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎略贮,沒想到半個(gè)月后甚疟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃延,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年览妖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽祥。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讽膏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拄丰,到底是詐尸還是另有隱情府树,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布料按,位于F島的核電站奄侠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏载矿。R本人自食惡果不足惜垄潮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闷盔。 院中可真熱鬧弯洗,春花似錦、人聲如沸逢勾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溺拱。三九已至逃贝,卻和暖如春谣辞,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沐扳。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工潦闲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迫皱。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辖众,于是被迫代替她去往敵國(guó)和親卓起。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)凹炸,也就是一...
    悟名先生閱讀 4,131評(píng)論 0 13
  • JavaScript語言精粹 前言 約定:=> 表示參考相關(guān)文章或書籍; JS是JavaScript的縮寫戏阅。 本書...
    微笑的AK47閱讀 578評(píng)論 0 3
  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,125評(píng)論 0 3
  • 人生無常,世事難料啤它,遠(yuǎn)離垃圾人奕筐,積極面對(duì)生活。
    簡(jiǎn)之行閱讀 116評(píng)論 0 0
  • 燃一柱香 青煙裊裊 化為灰燼 跌落 跌落 慢慢堆積
    千何閱讀 193評(píng)論 0 2