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('<">'.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)查看