1. 程式人生 > >面向對象 OOP

面向對象 OOP

追加 無需 實體 兩個 當前 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