亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Javascript 面向?qū)ο笾械臉?gòu)造函數(shù)和原型對象

microcosm1994 / 707人閱讀

摘要:每一個對象除外都和另外一個對象相關(guān)聯(lián),這個另外一個對象就是我們熟知的原型,每一個對象都從原型繼承屬性和行為方法。兩個構(gòu)造函數(shù)的屬性可能指向同一個原型對象,這時通過調(diào)用兩個構(gòu)造函數(shù)創(chuàng)建的實例是屬于同一個類的。

先解釋下原型。每一個Javascript對象(null除外)都和另外一個對象相關(guān)聯(lián),這個“另外一個對象”就是我們熟知的原型, 每一個對象都從原型繼承屬性和行為(方法)。

var   a = {}; //原型對象為Object.prototype
var   array = new Array()// 原型對象為Array.prototype
var   myInstance = new MyClass;// 原型對象為MyClass.prototype

在Javascript中,類的所有實例對象都從同一個原型對象上繼承屬性,下面先看一個例子

function Range是 Range類的構(gòu)造函數(shù)用以初始化新創(chuàng)建的Range類的對象,構(gòu)造函數(shù)并沒有創(chuàng)建并返回一個對象,僅僅是初始化,并且在構(gòu)造函數(shù)中用this設(shè)置的屬性不是每個實例共享的,而是獨享的,this是對當前對象的應(yīng)用。

function Range(from, to) {
          if(from)
               this.from = from;//對象的自有屬性,在對象中會覆蓋從原型那里繼承來的from值
          if(to)
               this.to = to; 
}

而所有對象實例都會繼承的屬性和行為(方法)都在原型對象里

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 因為在構(gòu)造函數(shù)初始化r的時候已經(jīng)把屬性“from”設(shè)置成2了

任何Javascript函數(shù)都可以做構(gòu)造函數(shù),并且用new 關(guān)鍵字調(diào)用構(gòu)造函數(shù)時是要用到一個prototype屬性的。因此每個javascript函數(shù)都會自動擁有一個prototype屬性。比如

Range.prototype.init = function () {}
nr = new Range.prototype.init();// nr 的屬性繼承自Range.prototype.init.prototype

原型對象是類的唯一標示,當且僅當兩個對象繼承自同一個原型對象時,他們才是屬于同一個類的實例,而初始化對象的構(gòu)造函數(shù)則不能作為類的標示。 兩個構(gòu)造函數(shù)的prototype屬性可能指向同一個原型對象,這時通過new調(diào)用兩個構(gòu)造函數(shù)創(chuàng)建的實例是屬于同一個類的。

上面的例子繼續(xù)修改

Range.prototype.init.prototype = Range.prototype;//引用傳遞所以不用擔心循環(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://www.ezyhdfw.cn/yun/85761.html

相關(guān)文章

  • JS對象(1)重新認識面向對象

    摘要:對象重新認識面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計模式上看,對象是計算機抽象現(xiàn)實世界的一種方式。除了字面式聲明方式之外,允許通過構(gòu)造器創(chuàng)建對象。每個構(gòu)造器實際上是一個函數(shù)對象該函數(shù)對象含有一個屬性用于實現(xiàn)基于原型的繼承和共享屬性。 title: JS對象(1)重新認識面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計模式上看,對象是...

    superw 評論0 收藏0
  • 面向對象JavaScript

    摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風(fēng)格,導(dǎo)致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣鳌1疚膶⒒貧w面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0
  • 重新認識JavaScript面向對象: 從ES5到ES6

    摘要:基于原型的面向?qū)ο笤诨谠偷恼Z言中如并不存在這種區(qū)別它只有對象不論是構(gòu)造函數(shù),實例,原型本身都是對象。允許動態(tài)地向單個的對象或者整個對象集中添加或移除屬性。為了解決以上兩個問題,提供了構(gòu)造函數(shù)創(chuàng)建對象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認識面向?qū)ο?1. JavaScript...

    VishKozus 評論0 收藏0
  • 重新認識JavaScript面向對象: 從ES5到ES6

    摘要:基于原型的面向?qū)ο笤诨谠偷恼Z言中如并不存在這種區(qū)別它只有對象不論是構(gòu)造函數(shù),實例,原型本身都是對象。允許動態(tài)地向單個的對象或者整個對象集中添加或移除屬性。為了解決以上兩個問題,提供了構(gòu)造函數(shù)創(chuàng)建對象的方式。 showImg(https://segmentfault.com/img/remote/1460000013229218); 一. 重新認識面向?qū)ο?1. JavaScript...

    用戶83 評論0 收藏0
  • 淺談JavaScript面向對象

    摘要:不必在構(gòu)造函數(shù)中定義對象實例的信息。其次,按照一切事物皆對象的這餓極本的面向?qū)ο蟮姆▌t來說,類本身并不是一個對象,然而原型方式的構(gòu)造函數(shù)和原型本身也是個對象。第二個問題就是在創(chuàng)建子類型的實例時,不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。 前言 對象(Object)應(yīng)該算是js中最為重要的部分,也是js中非常難懂晦澀的一部分。更是面試以及框架設(shè)計中各出沒。寫這篇文章,主要參考與JavaScrip...

    cyixlq 評論0 收藏0

發(fā)表評論

0條評論

microcosm1994

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<