這是一篇簡單介紹js物件導向的程式設計筆記
一,js解析和執行
js解析時,會先把var和function宣告的變數和函式放到乙個詞法物件裡,變數的值是undefined,函式則是乙個引用,這是js變數提公升的根本機制。
如果乙個變數沒有宣告就開始使用了,不論它是在區域性還是全域性使用,它都是掛在了window下,是個全域性變數,這點和this指向很類似,this找不到直接呼叫者,也是直接指向window。
如果變數名和函式名命名衝突了,則該命名最後指向的是函式。如果兩個函式名重複了,則後面乙個函式覆蓋前面的,因為在js中,函式才是第一等公民。
e.g.二,作用域console.log(a)
//undefined
var a = 1console.log(a)//1
e.g.
console.log(aa)
//function aa()
var aa = 1
function
aa()
function
aa()
js只有全域性作用域和區域性(函式)作用域,並且內部可以由內到外,從近到遠,訪問即止地層層訪問外部變數,形成一條作用域鏈,而外部不能直接訪問內部變數。
e.g.三,閉包var a = 1
var b = function
() b()//3
console.log(c)//
undefined
一種訪問區域性變數的手段,通常指的是乙個可以訪問區域性變數的函式。
閉包乙個是前面提到的可以讀取函式內部的變數,另乙個就是讓這些變數的值始終保持在記憶體中,因此要注意控制效能,提高網頁效能。
e.g.四,類與物件var name = "the window";
var object =;}};
//執行了object.getnamefunc()返回的函式,此時this找不到直接呼叫者,直接指向window
alert(object.getnamefunc()());
e.g.
var name = "the window";
var object =;}};
//執行了object.getnamefunc()返回的函式,此時this固定化成了object,彈出object.name
alert(object.getnamefunc()());
搞清楚js中的類,就需要明白三個概念:建構函式、原型物件,例項化和例項。
e.g.其中person函式就是建構函式,person.prototype指向的物件就是原型物件,xm就是例項function
person(name,age)
person.prototype.hello = function
()
var xm = new person('xiaoming',12)
xm.hello()
//hello,i am xiaoming,and i am 12
person.prototype =
var xmm = new person('xiaomingming',34)
console.log(xm.asset)
//undefined
console.log(xmm.asset)//
12345
1,乙個新物件被建立了,繼承person.prototype原型物件裡的屬性。
2,使用指定的引數呼叫建構函式person,並將this指向新建立的物件。
如果我們用自定義函式模擬過程,則:
e.g.在js中,並沒有真正的類的概念,只是用建構函式和原型物件模擬了類,其中原型物件是類的唯一標識,當且僅當兩個物件繼承自同乙個原型物件的時候,我們才說它們是同乙個類的例項。而初始化物件的建構函式則不能作為類的標識,通常建構函式的名字被用來當做類名了而已。function
person(name,age)
function
new(f)
return
o }
}var xmmm = new(person)('xmmm',232)
instanceof 運算子
例項 instanceof 類名 被用來判斷乙個例項是否繼承自某個原型物件,返回布林值。
在上述例子中,原型物件也是物件,也具有原型物件,即原型物件的原型物件,以此類推。訪問乙個例項本身沒有的屬性或方法時,js會從原型物件上去找,原型物件上沒有時,會從原型物件上的原型物件上去找,......這種像鏈式一樣地繼承機制就是原型鏈,和作用域鏈很類似。
原型物件中constructor屬性則是指向該原型物件的建構函式,在修改原型物件時,比如增刪其屬性時,可採用.符號操作,如person.prototype.hello = s =>,在例項person初始化的時候,該原型物件的constructor預設指向建構函式.
但是如果直接給person.prototype賦值物件型資料時,則需要顯式指定constructor屬性,否則原有的原型物件會被新物件所替代,而通過建構函式例項化的例項的__protoo__屬性都會指向最新的person.prototype物件。在這個改動之後例項化的例項均不能繼承原有的原型物件的屬性,改動之前的例項亦不能繼承新原型物件的屬性。
例項,建構函式,原型物件,原型鏈之間的關係可以借助一張神圖來說明關係
this指標問題:
1,總是指向方法的直接呼叫物件,在事件觸發中指向觸發該事件的dom節點物件
2,指向new出來的例項
五,封裝
一段**能夠實現某種功能,隱藏該**的細節,僅對外開放介面去使用該功能**,即是對該功能**的封裝。
六,繼承
繼承可以使得子類具有父類的屬性和方法或者重新定義、追加屬性和方法等。具有的方式可能是複製,可能是引用。
從物件層面上來看繼承:
1,複製
var zsh =涉及到深淺複製參考:var job =
for (var key in
job)
console.log(zsh)
//
2,object.create(proto[, propertiesobject])
es5裡的方法,注意相容性。
引數proto 新建立物件的原型物件。
propertiesobject 可選。如果沒有指定為 undefined,則是要新增到新建立物件的可列舉屬性(即其自身定義的屬性,而不是其原型鏈上的列舉屬性)物件的屬性描述符以及相應的屬性名稱。這些屬性對應object.defineproperties()的第二個引數。
返回值在指定原型物件上新增新屬性後的物件。
從類的層面上來看繼承:
//七,多型建立父類
//建立子類
//建立聯絡,修正建構函式
//例項化
function
father() {}
function
son() {}
son.prototype =object.create(father.prototype)
//此時,son.prototype.constructor指向的是function father() {},我們最好是將其修正過來
son.prototype.constructor = son
'見人說人話,見鬼說鬼話。'
根據不同的引數個數,呼叫不同的方法,實現不同的功能
本質上是檢測arguments中資料型別來做對應的操作,將差異化的處理方式通用封裝處理。
e.g.function
duotai(a,b,c,d,e,f)
duotai(1,2,3,4)//
6 4e.g.
function
add()
return
result
}add(1,2,3,4,6,7,8)//
31 add(343,567,8456,234)//
9600
c 物件導向程式設計 物件導向
什麼是物件導向 是對現實世界理解和抽象的方法。物件導向程式設計的特點 易維護,易擴充套件,靈活性好,重用 類 對事物的抽象定義,即事物具有的共同特徵和行為。物件 即對類進行例項 類是抽象的,物件是具體的 類的定義 語法 訪問修飾符 class 類名類的成員 包括字段,屬性,方法,常量,事件和索引器等...
物件導向程式設計
物件導向程式設計 抽象 封裝 繼承 多型 單一職責原則 就乙個類而言,應該僅有乙個引起它變化的原因。開放封閉原則 軟體實體應該可以擴充套件,但是不可修改。所有的設計模式都是對不同的可變性進行封裝,從而使系統在不同的角度上達到開發封閉原則。依賴倒轉原則 a 高層不應該依賴低層,兩個都應該依賴抽象。b ...
物件導向程式設計
class team def init self self.name tampa bay buccaneers bucs team print bucs.name tampa bay buccaneers 當呼叫team 函式時,會自動呼叫init函式,self是自動傳入到init中的引數,它指向當...