摘要:每一個(gè)對象除外都和另外一個(gè)對象相關(guān)聯(lián),這個(gè)另外一個(gè)對象就是我們熟知的原型,每一個(gè)對象都從原型繼承屬性和行為方法。兩個(gè)構(gòu)造函數(shù)的屬性可能指向同一個(gè)原型對象,這時(shí)通過調(diào)用兩個(gè)構(gòu)造函數(shù)創(chuàng)建的實(shí)例是屬于同一個(gè)類的。
先解釋下原型。每一個(gè)Javascript對象(null除外)都和另外一個(gè)對象相關(guān)聯(lián),這個(gè)“另外一個(gè)對象”就是我們熟知的原型, 每一個(gè)對象都從原型繼承屬性和行為(方法)。
var a = {}; //原型對象為Object.prototype var array = new Array()// 原型對象為Array.prototype var myInstance = new MyClass;// 原型對象為MyClass.prototype
在Javascript中,類的所有實(shí)例對象都從同一個(gè)原型對象上繼承屬性,下面先看一個(gè)例子
function Range是 Range類的構(gòu)造函數(shù)用以初始化新創(chuàng)建的Range類的對象,構(gòu)造函數(shù)并沒有創(chuàng)建并返回一個(gè)對象,僅僅是初始化,并且在構(gòu)造函數(shù)中用this設(shè)置的屬性不是每個(gè)實(shí)例共享的,而是獨(dú)享的,this是對當(dāng)前對象的應(yīng)用。
function Range(from, to) { if(from) this.from = from;//對象的自有屬性,在對象中會覆蓋從原型那里繼承來的from值 if(to) this.to = to; }
而所有對象實(shí)例都會繼承的屬性和行為(方法)都在原型對象里
Range.prototype = { includes : function(x) {return this.from <= x && x <= this.to}, foreach : function(f) { for(var x = Math.ceil(this.form); x < this.from; x++) f(x); }, toString : function() {return "(" + this.from + "......" + this.to + ")";}, from : 1, getBeginning : function() {return this.from} }
var r = new Range(2, 5); r.include(3);// true , 3在范圍內(nèi) r.foreach(alert);//輸出2 3 4 5 console.log(r)// r.getBeginng() // 2 因?yàn)樵跇?gòu)造函數(shù)初始化r的時(shí)候已經(jīng)把屬性“from”設(shè)置成2了
任何Javascript函數(shù)都可以做構(gòu)造函數(shù),并且用new 關(guān)鍵字調(diào)用構(gòu)造函數(shù)時(shí)是要用到一個(gè)prototype屬性的。因此每個(gè)javascript函數(shù)都會自動擁有一個(gè)prototype屬性。比如
Range.prototype.init = function () {} nr = new Range.prototype.init();// nr 的屬性繼承自Range.prototype.init.prototype
原型對象是類的唯一標(biāo)示,當(dāng)且僅當(dāng)兩個(gè)對象繼承自同一個(gè)原型對象時(shí),他們才是屬于同一個(gè)類的實(shí)例,而初始化對象的構(gòu)造函數(shù)則不能作為類的標(biāo)示。 兩個(gè)構(gòu)造函數(shù)的prototype屬性可能指向同一個(gè)原型對象,這時(shí)通過new調(diào)用兩個(gè)構(gòu)造函數(shù)創(chuàng)建的實(shí)例是屬于同一個(gè)類的。
上面的例子繼續(xù)修改
Range.prototype.init.prototype = Range.prototype;//引用傳遞所以不用擔(dān)心循環(huán)引用;
這樣通過new Range()和 new Range.prototype.init()創(chuàng)建的對象都是屬于Range類的。
console.log((r instanceof Range)); //true console.log((nr instanceof Range)); //true
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/85761.html
摘要:對象重新認(rèn)識面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計(jì)模式上看,對象是計(jì)算機(jī)抽象現(xiàn)實(shí)世界的一種方式。除了字面式聲明方式之外,允許通過構(gòu)造器創(chuàng)建對象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)對象該函數(shù)對象含有一個(gè)屬性用于實(shí)現(xiàn)基于原型的繼承和共享屬性。 title: JS對象(1)重新認(rèn)識面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計(jì)模式上看,對象是...
摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...
摘要:基于原型的面向?qū)ο笤诨谠偷恼Z言中如并不存在這種區(qū)別它只有對象不論是構(gòu)造函數(shù),實(shí)例,原型本身都是對象。允許動態(tài)地向單個(gè)的對象或者整個(gè)對象集中添加或移除屬性。為了解決以上兩個(gè)問題,提供了構(gòu)造函數(shù)創(chuàng)建對象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認(rèn)識面向?qū)ο?1. JavaScript...
摘要:基于原型的面向?qū)ο笤诨谠偷恼Z言中如并不存在這種區(qū)別它只有對象不論是構(gòu)造函數(shù),實(shí)例,原型本身都是對象。允許動態(tài)地向單個(gè)的對象或者整個(gè)對象集中添加或移除屬性。為了解決以上兩個(gè)問題,提供了構(gòu)造函數(shù)創(chuàng)建對象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認(rèn)識面向?qū)ο?1. JavaScript...
摘要:不必在構(gòu)造函數(shù)中定義對象實(shí)例的信息。其次,按照一切事物皆對象的這餓極本的面向?qū)ο蟮姆▌t來說,類本身并不是一個(gè)對象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個(gè)對象。第二個(gè)問題就是在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計(jì)中各出沒。寫這篇文章,主要參考與JavaScrip...
閱讀 2342·2021-11-22 14:56
閱讀 1484·2021-09-24 09:47
閱讀 915·2019-08-26 18:37
閱讀 2834·2019-08-26 12:10
閱讀 1531·2019-08-26 11:55
閱讀 3153·2019-08-23 18:07
閱讀 2308·2019-08-23 14:08
閱讀 614·2019-08-23 12:12