面向對象 OOP
阿新 • • 發佈:2017-05-15
追加 無需 實體 兩個 當前 win 方法名 匯編語言 ext [面向對象編程OOP]
1 語言的分類
面向機器 :匯編語言
面向過程 :c語言
面向對象 :c++ Java PHP等
2 面向過程與面向對象
面向過程:專註於如何去解決一個問題的過程,編程特點是一個函數去實現過程操作,沒有類與對象的概念
面向對象:專註於有哪一個對象實體去解決這個問題,編程特點是:出現一個個的類,由類去生成對象
【面向對象的三大特征】
繼承 封裝 多態
類與對象的關系
1類 : 一群有相同特征(屬性)和行為(方法)的集合
人類 屬性:身高 ,年齡。體重, 方法:吃飯 睡覺 敲代碼
2對象: 從類中,拿出的具有確定屬性值和方法的個體
張三 屬性 身高180 方法 說話
3類和對象的關系
類是抽象的,對象是具體的。類是對象的抽象化,對象是類的具體化
通俗來講,類是一個抽象的概念,表示具有相同屬性和行為的集合,但是類僅僅表明這類群體具有向同的屬性
但是沒有具體的屬性值
而對象是對類的屬性進行具體賦值後,而得到的一個具體的個體
4實用類和對象的步驟
① 創建一個類(構造函數) 類名:必須要每個單詞的首字母都大寫
Function 類名(屬性一){
this.屬性=屬性一
this.方法=Function(){}
this 指向誰?即將調用當前構造函數的對象
}
② 通過類,實例化出一個新對象
var obj = new 類名(屬性——value)
原構造函數中的this,指向新創建的obj對象
obj.方法(); 調用方法
obj.屬性(); 調用屬性
實例化對象,會執行創造函數
5 兩個重要的屬性
constructor: 返回當前對象的構造函數 只有對象才有,返回的是構造函數-類
>>> zhangsan.constructor == Person true
>>> 對象的constructor,位於_proto_原型對象上 (後續講解)
instanceof:判斷對象是否是某個類的實例
>>>zhangsan instanceof Person true
>>>preson instanceof Objiect true
>>>zhangsan instanceof Object true
6廣義對象與狹隘對象
狹義對象:只有屬性,方法。除此之外沒有任何東西
var obj = {}; var obj = new Object();
廣義對象: 除了用字面量聲明的基本數據類型之外分,萬物接對象,換句話說,能夠添加屬性和方法的變量,就是對象
var s = "1" 不是對象
var s = new String("1") 是對象
①定義一個(類)構造函數
function Person(name,age,sex){
類的屬性
this.name=name;
this.age= age;
this.sex= sex;
類的方法
this.say = function(){
alert("我叫"+this.name+";今年"+this.age+"歲;"+"我是一個"+this.sex+"生")
}
}
從類中,實例化出一個對象,並給對象的屬性賦值
var zhangsan = new Person("張三",18,"男");
zhangsan.say();
var lisi = new Person("李四",12,"男");
lisi.say();
var wanger = new Person("王二",14,"女");
wanger.say();
Person();
var arr = [Person,1,2,3]
arr[0]();
person.height = 10;
console.log(zhangsan);
console.log(zhangsan instanceof Person);
console.log(zhangsan instanceof Object);
</script>
[成員屬性與成員方法]
1、在構造函數中聲明,通過 this屬性聲明,或者實例化出對象後,通過"對象.屬性"追加的,都屬於成員屬性、或成員方法也叫實力屬性與實例方法
成員屬性/方法 是屬於實例化出的這個對象
通過"對象.屬性"調用
[靜態屬性和靜態方法]
2、通過類名.屬性名 "類名.方法名"聲明的變量,稱為靜態屬性、靜態方法;也叫類屬性,類方法
類屬性/類方法 是屬於類的(屬於構造函數)
通過"類名.屬性"調用
3、成員屬性是屬於實例化出的對象的,會出現在新對象的屬性上
靜態屬性是屬於構造函數自己的,是不會出現在新對象的屬性上
4 JS對象屬性的刪除
①對象無需手動刪除,JS提供了一種主動釋放對象內存的方法(及對象無用後,自動刪除)
②刪除對象的屬性,delete 對象名.屬性名
5 對象是引用數據類型
也就是說,當new出一個對象是,這個obj變量存儲的實際上是對象的地址,在對象賦值時,負的也是地址
function Person(){}
var zhangsan = new Person();//zhangsan對象實際存的是地址,
var lisi = zhangsan // 實際上是吧zhangsan 的地址給了lisi
lisi.name = "李四"//lis通過地址,修改了對象
console.log(zhangsan.name);//張三再通過地址打開對象,實際已經變了
引用數據類型,賦值時,傳遞的是引用(地址)——快捷方式
基本數據類型,賦值時傳遞的是數據(值)
6、私有屬性與私有方法
在構造函數中,通過var聲明的屬性。稱為私有屬性
function Person(){var num = 1;}
私有屬性的作用域,盡在當前函數有效,對外不公開,即通過對象/類都無法調用到。
function Person(name){ this.name = name;成員屬性 } Person.hei = 20;靜態屬性 var zhangsan = new Person("張三"); zhangsan.age= 24 成員屬性 delete zhangsan.name;刪除對象屬性 var lisi = zhangsan; lisi.name = "李四"; console.log(zahngsan); [this詳解] 1、誰最終調用函數,this指向。 ①this指向的,永遠只可能是對象!!! ②this指向誰,永遠不取決與this寫在哪,而是取決於函數在哪調用 ③this指向的對象,我們稱之為函數的上下文context 也加函數的調用者 2、※※※※※this指向的規律(與函數調用的方式息息相關); this指向的情況,取決於函數調用的方式有哪些 ① 通過函數()直接調用:this指向window ② 通過對象.函數名()調用的,this指向這個對象 ③ 函數作為數組的一個元素通過數組下標調用的,this指向這個數組 ④ 函數做為window內置函數的回調函數調用; this指向window ⑤ 函數作為構造函數,用new關鍵字調用時,this指向新new出的對象 function func1(){ //this[2]=10; console.log(this) } // ① 通過函數()直接調用:this指向window func1();//this--->window //② 通過對象.函數名()調用的,this指向這個對象 //狹義對象 var obj = { name:"obj", func1:func }; obj.func1();//this--->obj //廣義對象 document.getElementById("div").onclick = function(){ this.style.backgroundColor = "red" };//this——>div // ③ 函數作為數組的一個元素通過數組下標調用的,this指向這個數組 var arr = [func,1,2,3]; arr[0]();//this--->arr數組 //④ 函數做為window內置函數的回調函數調用; this指向window setTimeout(func,1000);//this--->window //setInterval(func,1000); ⑤ 函數作為構造函數,用new關鍵字調用時,this指向新new出的對象 var obj = new func();//this--->>new出的新obj 綜合小練習 var obj1={ name:"obj1", arr:[setTimeout(func,3000),1,2,3] } document.getElementById("div").onclick = obj1.arr[0]; /符合規律⑤ 函數最終調用者 setTimeout this--->window var obj1={ name:"obj1", arr:[func,1,2,3] } document.getElementById("div").onclick = obj1.arr[0](); 符合規律③ 函數最終調用者 數組下標 this--->arr var obj1={ name:"obj1", arr:[{name:"arrobj",fun:func},1,2,3] } document.getElementById("div").onclick = obj1.arr[0].fun(); //函數最終調用者 {name:"arrobj",fun:func} 符合規律② this--->obj
面向對象 OOP