js里的繼承是怎樣的
??? function Exx(){}
??? Exx.prototype.z = 1;
??? var obj = new Exx();
??? console.log(obj instanceof Object);//true 能證明所有對象皆是繼承自Object嗎?
??? var des = Object.getOwnPropertyDescriptor(Object,"prototype");//正確
?var des = obj.getOwnPropertyDescriptor(Object,"prototype");//錯誤? 沒有這個方法,為什么,不是繼承自那個對象嗎
var des = obj.getOwnPropertyDescriptor(obj,"prototype");//錯誤 obj不是也應該有這個屬性嗎
var des = Object.getOwnPropertyDescriptor(Exx,"prototype");//錯誤 ?
var des = Exx.getOwnPropertyDescriptor(Exx,"prototype");//錯誤 ?
2015-01-29
你的問題太多太零散了,我挑重點的回答下。
prototype是函數(shù)對象默認就會有一個對象屬性。本身也是對象,它的作用是:作為通過new 構造函數(shù)調用時產(chǎn)生的對象的原型。
JS是基于原型鏈繼承的,和Java/C#這種基于類繼承的語言有很大不同,后面OOP會展開講解,不是一句兩句說得清楚的。感興趣也可以自己查閱JavaScript OOP相關資料。
函數(shù)是對象并不只是JavaScript這樣做,這叫做first class function(第一類函數(shù))特性,很多語言都有。百度一下。
2015-01-29
問題1: true 能證明所有對象皆是繼承自Object?
答:instanceof檢查的是左邊對象的原型鏈上是否有右邊構造器的prototype屬性。(詳看第一章數(shù)據(jù)類型有instanceof的講解),一般情況下,對象字面量、一般函數(shù)構造器用new構造的對象,原型鏈上都會有Object.prototype, 所以instanceof Object返回true,但并不是所有對象都這樣。例如:
問題2:錯誤 ?沒有這個方法,為什么,不是繼承自那個對象嗎?
getOwnPropertyDescriptor是Object構造器函數(shù)對象上的方法,而不是Object.prototype上的方法,所以不可以直接在一般對象上調用getOwnPropertyDescriptor。
問題3. 錯誤?obj不是也應該有這個屬性嗎?
同2,例如Object.prototype.toString方法存在,所以一般對象都有toString可以使用:
var obj = {};
obj.toString; // function
但getOwnPropertyDescriptor是Object函數(shù)對象上的方法,而不是Object.prototype上的方法,不會出現(xiàn)在所有一般的對象上。
2015-06-08
建議去看阮一峰javascript技術blog。
2015-01-29
聽您的解釋看我這樣說對嗎?
哦,這種是原型鏈繼承,只要不在prototype上的屬性就不會被繼承
除了那個var?obj?=?Object.create(null);外new出來的都有prototype,這對象可以有自己prototype上的變量甚至對象,
也指向了繼承自的上級prototype上的屬性 ,那prototype算是什么數(shù)據(jù)類型??
網(wǎng)上有說prototype是上級的實例,是上級的引用? js中有類和對象的概念嗎?和java有什么不同嗎?感覺js很隨意,一個函數(shù)就是一個對象,var?obj?=?new?Exx();?obj?的prototype和Exx的prototype ?是obj->Exx->Object 感覺不到類和對象的區(qū)分