JavaScript物件導向之類的繼承,javascript物件導向
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>JavaScript中的繼承</title><script type="text/javascript">// 父類function Person(name,email){ // 父類的構造方法this.name = name ;this.email = email ;}Person.prototype.getInfo = function(){return this.name+"的Email是:"+this.email ;}// 子類function Employee(name,email,title){// 如同進階程式語言中的super()方法,調用父類的構造方法,但必須傳入scope為子類對象的執行個體Person.call(this,name,email) ;// 子類特色的屬性this.title = title ;}// 如果要繼承Person,子類的prototype必須指定父類的執行個體Employee.prototype = new Person () ;var emp = new Employee('1212','11222@qq.com','title1234');// 如果沒有明確支援子類使用構造方法為父類的構造方法 console.info(Employee.prototype);console.info(emp.getInfo());delete Employee.prototype.name ; // 如果子類不需要父類的屬性可以通過delete進行刪除// 如果子類和父類的構造方法處理事情不同可以明確的指出用子類的構造方法Employee.prototype.constructor = Employee ;console.info(Employee.prototype.constructor) ;</script></head><body></body></html>
javascript是物件導向的,從什方面可以體現他的繼承性
........JS只是基於物件導向的,而不是真正的物件導向,因為物件導向的3大特性:封裝.繼承和多態它並沒有!
javascript 進 繼承把弄暈了
這是一個典型的JavaScript原型鏈繼承的問題。
一、JavaScript物件導向的世界觀
JavaScript中除了5種未經處理資料類型之外,其他所有的都是對象,包括函數(function)對象;
JavaScript中沒有類的概念,只有函數和原型。外面有的JavaScript文章會提到類,這隻是一個比喻,相對於基於類的語言(Java、C#)可以理解為類,但絕對不是類;
JavaScript不是基於類的物件導向繼承,而是基於原型的物件導向繼承,實現原理主要依賴於JavaScript的原型鏈機制;
上面的這幾條是JavaScript的基本原則,如果理解了,就可以往下繼續。
二、函數與對象的區別
// 這是一個函式宣告,按照上面原則的原則,Person是一個函數對象function Person(){}// 這是一個直接量對象建立,使用{}直接量建立一個對象,並賦值給obj引用var obj= {};
三、建構函式與函數的區別
JavaScript中除了函數之外,還有一個概念叫建構函式,千萬不要被這個名字忽悠到,建構函式就是函數,本質沒有任何區別,只是一個意識形態的東西。稱之為建構函式是能讓人直接從名字上就可以區分出函數的功能不同,如下:
function fn1() {}fn1(); // fn1函數只是一個調用,所以它只是個普通函數function Klass() {}new Klass(); // Klass使用new操作符執行個體化了,所以我們直接稱Klass為建構函式// 同樣我們如果希望fn1也被執行個體化去使用,那麼也可以稱fn1為建構函式new fn1();
然而JavaScript依然習慣的使用了基於類語言的命名方式,建構函式使用大寫字母開頭,當作一個類來看待。
四、函數對象與對象的區別
如題主的問題:
// 這是一個函數對象,它是建構函式(Function)的執行個體對象// 注意:我這裡寫的建構函式(Function)與上面的函數(function)對象,頭字母大小寫不同function Person(){}// 這是一個對象,是建構函式(Object)的執行個體對象var obj= {};// 同時,建構函式(Function)與建構函式(Object)都是一個函數對象
只有函數對象才能使用 new操作符 來執行個體化對象:
new Person(); // 這是可以行得通的new obj(); // JavaScript引擎會拋異常“TypeError: object is not a function”
五、prototype與__proto__的區別
先說prototype,prototype這個屬性是原型對象,只有函數對象才有這個屬性,prototype也是一個對象。
而__proto__是所有JavaScript對象都有的一個私人屬性,__proto__是唯讀,不論普通的對象還是函數對象都有__proto__屬性。
__proto__指向到它的建構函式的prototype對象:
// obj是建構函式(Object)的執行個體對象,所以console.log(obj.__proto__ === Object.prototype); // true// Person是建構函式(Function)的......餘下全文>>