關(guān)于對(duì)象-原型

1.OOP 指什么界阁?有哪些特性

  • OOP:Object-oriented programming棺棵,縮寫OOP身弊,即面向?qū)ο蟪绦蛟O(shè)計(jì),其中兩個(gè)最重要的概念就是類和對(duì)象典格。類只是具備了某些功能和屬性的抽象模型岛宦,而實(shí)際應(yīng)用中需要一個(gè)一個(gè)實(shí)體,也就是需要對(duì)類進(jìn)行實(shí)例化耍缴,類在實(shí)例化之后就是對(duì)象砾肺。

對(duì)象:將類實(shí)例化
實(shí)例化:就是將類實(shí)現(xiàn)的過程

  • 目的:
    1.改善可讀性
    2.提高重用性

  • 原則:開放封閉原則
    1.開放:對(duì)模塊進(jìn)行擴(kuò)展
    2.封閉:不必改動(dòng)模塊的源代碼

  • 特性:三要素繼承齐佳,封裝,多態(tài)
    1.繼承性:子類自動(dòng)繼承其父級(jí)類中的屬性和方法债沮,并可以添加新的屬性和方法或者對(duì)部分屬性和方法進(jìn)行重寫炼吴。繼承增加了代碼的可重用性。
    2.多態(tài)性:子類繼承了來自父級(jí)類中的屬性和方法疫衩,并對(duì)其中部分方法進(jìn)行重寫硅蹦。
    3.封裝性:將一個(gè)類的使用和實(shí)現(xiàn)分開,只保留部分接口和方法與外部聯(lián)系闷煤。

2.如何通過構(gòu)造函數(shù)的方式創(chuàng)建一個(gè)擁有屬性和方法的對(duì)象童芹?

var Animal = function(){
         this.name = '動(dòng)物'
        
}//構(gòu)造函數(shù)

Animal.prototype.say =function(){
         console.log(this.name+'叫')
}

var animal = new Animal()//實(shí)例化,得到一個(gè)對(duì)象
animal.say()
QQ截圖20170412180915.jpg

3. prototype 是什么鲤拿?有什么特性

function定義的對(duì)象有一個(gè)prototype屬性假褪,prototype屬性又指向了一個(gè)prototype對(duì)象,注意prototype屬性與prototype對(duì)象是兩個(gè)不同的東西近顷,要注意區(qū)別生音。在prototype對(duì)象中又有一個(gè)constructor屬性,這個(gè)constructor屬性同樣指向一個(gè)constructor對(duì)象窒升,而這個(gè)constructor對(duì)象恰恰就是這個(gè)function函數(shù)本身缀遍。

QQ截圖20170412202346.jpg

這個(gè)prototype到底有什么作用呢?看下面的例子:

    function obj1(){}
    obj1.prototype.name = "zyn";
    var test = new obj1();
    console.log(test.name)// zyn 

奇怪吧饱须,明明沒有為test設(shè)置name屬性域醇,可是為什么會(huì)有值?
這就是prototype的功勞了蓉媳,prototype屬性中的name對(duì)象譬挚,在new構(gòu)造函數(shù)之后,被繼承到了對(duì)象test的屬性中酪呻。接著看:


    var name = "js";
    function obj2(name){
       console.log(this.name);//css
    }
    obj2.prototype.name = "css";
    var test = new obj2();
     console.log(test.name)//css

第一步是建立一個(gè)新對(duì)象(test)减宣。
第二步將該對(duì)象(test)內(nèi)置的原型對(duì)象設(shè)置為構(gòu)造函數(shù)prototype 屬性引用的那個(gè)原型對(duì)象。
第三步就是將該對(duì)象(test)作為this 參數(shù)調(diào)用構(gòu)造函數(shù)号杠,完成成員設(shè)置等初始化工作蚪腋。
其中第二步中出現(xiàn)了一個(gè)新名詞就是內(nèi)置的原型對(duì)象,注意這個(gè)新名詞跟prototype對(duì)象不是一回事姨蟋, 為了區(qū)別我叫它inobj,inobj就指向了函數(shù)的prototype對(duì)象屉凯。在prototype對(duì)象中出現(xiàn)的任何屬性或者函數(shù)都可以在test對(duì)象中直接使用,這個(gè)就是JS中的原型繼承了眼溶。

通常悠砚,這樣創(chuàng)建一個(gè)對(duì)象:

 function person(name){
        this.name = name 
        this.sayHi = function(){
            console.log('Hi' +' '+ this.name)
        }
       
    }
     
     var z= new person('zyn')
     z.sayHi()//Hi zyn

以上式镐,使用new關(guān)鍵字癌刽,通過對(duì)象(函數(shù)也是特殊對(duì)象)創(chuàng)建一個(gè)對(duì)象實(shí)例构韵。

在基于類的語言中悴晰,屬性或字段通常都是在類中事先定義好了,但在Javascript中枢泰,在創(chuàng)建對(duì)象之后還可以為類添加字段描融。

var Animal =function(){}
var cat = new Animal();
 cat.color = "green";

以上,color這個(gè)字段只屬于當(dāng)前的cat實(shí)例衡蚂。

對(duì)于后加的字段窿克,如果想讓animal的所有實(shí)例都擁有呢?
使用prototype

       var Animal =function(){}
        Animal.prototype.color= "green";
        var cat = new Animal();
        var dog = new Animal();
        console.log(cat.color);//green
        console.log(dog.color);//green

通過Prototype不僅可以添加字段毛甲,還可以添加方法年叮。

var Animal =function(){}
Animal.prototype.color= "green";
var cat = new Animal();
var dog = new Animal();
console.log(cat.color);//green
console.log(dog.color);//green
Animal.prototype.run= function(){
    console.log("run")
}
dog.run();

原來通過prototype屬性,在創(chuàng)建對(duì)象之后還可以改變對(duì)象的行為玻募。
比如只损,可以為數(shù)組這個(gè)特殊對(duì)象添加一個(gè)方法。

Array.prototype.remove = function(elem){//elem=2
      var index = this.indexOf(elem);//index=1
         if(index >= 0){
            this.splice(index, 1);
          }
}
var arr = [1, 2, 3] ;
arr.remove(2);
//原數(shù)組變?yōu)閍rr[1,3]

除了通過prototype為對(duì)象定義屬性或方法七咧,還可以通過對(duì)象的構(gòu)造函數(shù)來定義類的屬性或方法跃惫。

var Animal = function(){
    this.color = "green";
   this.run = function(){
    console.log("run");
     }
}
var mouse = new Animal();
  mouse.run();

以上做法的也可以讓所有的Animal實(shí)例共享所有的字段和方法。并且還有一個(gè)好處是可以在構(gòu)造函數(shù)中使用類的局部變量坑雅。

var Animal = function (){
       var runAlready = false;
       this.color = "green";
       this.run = function(){
            if(!runAlreadh){
        console.log("start running");
       } else {
          console.log("already running")
         }
    }

 }

其實(shí)辈挂,一個(gè)更加實(shí)際的做法是把通過構(gòu)造函數(shù)結(jié)合通過prototype定義一個(gè)類的字段和行為。

ar Animal = function (){
       var runAlready = false;
       this.color = "green";
       this.run = function(){
            if(!runAlready){
        console.log("start running");
       } else {
          console.log("already running")
         }
    }

 }
Animal.prototype.color = '';
Animal.prototype.hide = function(){
       console.log("111");
}
var horse = new Animal();
horse.run(); //start running
horse.hide();//111

Prototype允許我們?cè)趧?chuàng)建對(duì)象之后來改變對(duì)象或類的行為裹粤,并且這些通過prototype屬性添加的字段或方法所有對(duì)象實(shí)例是共享的。

4.畫出如下代碼的原型圖

function People (name){
  this.name = name;
  this.sayName = function(){
    console.log('my name is:' + this.name);
  }
}

People.prototype.walk = function(){
  console.log(this.name + ' is walking');  
}

var p1 = new People('zyn');
var p2 = new People('JL');
QQ截圖20170412220720.jpg

5. 創(chuàng)建一個(gè) Car 對(duì)象蜂林,擁有屬性name遥诉、color、status噪叙;擁有方法run矮锈,stop,getStatus

var Car = function(name,color,status){
    this.name =name;
    this.color =color;
    this.status = status;
   
}
    Car.prototype.run =function(){
        console.log('running')
    }
    
    Car.prototype.stop =function(){
        console.log('stop')
    }
    
    Car.prototype.getStatus =function(){
        console.log(this.status)
    }
var Ben = new Car ('Ben','black',120)
QQ截圖20170412222108.jpg

6.創(chuàng)建一個(gè) GoTop 對(duì)象睁蕾,當(dāng) new 一個(gè) GotTop 對(duì)象則會(huì)在頁面上創(chuàng)建一個(gè)回到頂部的元素苞笨,點(diǎn)擊頁面滾動(dòng)到頂部。

20170413_002555.gif
//主要代碼


var GoTop = function(ct,target){
              this.ct = ct;
              this.target = $('<div class="goTop">回到頂部</div>')
              this.target.css({
                    position:'fixed',
                    right:'100px',
                    bottom:'50px',
                    display:'none',
                    padding:'8px',
                    cursor:'pointer',
                    border:'1px solid',
                    borderRadius:'4px'
                })

          }
          GoTop.prototype.creatNode = function(){
              this.ct.append(this.target);
          }

          GoTop.prototype.bindEvent = function(){
              var _this = this;
              var $window = $(window);
            
              $window.on('scroll',function(){
                var $top = $window.scrollTop()
                  if($top>100){
                      _this.target.css('display','block')
                  }else{
                      _this.target.css('display','none')
                  }
              })
              this.target.on('click',function(){
                _this.ct.animate({
                   scrollTop : 0
               })
              })
          }

          var Gotop =new GoTop($('body'))
          Gotop.creatNode();
          Gotop.bindEvent();

效果
希望對(duì)給位朋友有所幫助~~
版權(quán)歸饑人谷--楠柒所有如有轉(zhuǎn)發(fā)請(qǐng)注明出處 謝謝~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末子眶,一起剝皮案震驚了整個(gè)濱河市瀑凝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌臭杰,老刑警劉巖粤咪,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渴杆,居然都是意外死亡寥枝,警方通過查閱死者的電腦和手機(jī)宪塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來囊拜,“玉大人某筐,你說我怎么就攤上這事」邗危” “怎么了南誊?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蔽莱。 經(jīng)常有香客問我弟疆,道長,這世上最難降的妖魔是什么盗冷? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任怠苔,我火速辦了婚禮,結(jié)果婚禮上仪糖,老公的妹妹穿的比我還像新娘柑司。我一直安慰自己,他們只是感情好锅劝,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布攒驰。 她就那樣靜靜地躺著,像睡著了一般故爵。 火紅的嫁衣襯著肌膚如雪玻粪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天诬垂,我揣著相機(jī)與錄音劲室,去河邊找鬼。 笑死结窘,一個(gè)胖子當(dāng)著我的面吹牛很洋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隧枫,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼喉磁,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了官脓?” 一聲冷哼從身側(cè)響起协怒,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎确买,沒想到半個(gè)月后斤讥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年芭商,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了派草。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡铛楣,死狀恐怖近迁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情簸州,我是刑警寧澤鉴竭,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站岸浑,受9級(jí)特大地震影響搏存,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜矢洲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一璧眠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧读虏,春花似錦责静、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至揩徊,卻和暖如春腰鬼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塑荒。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工垃喊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人袜炕。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像初家,于是被迫代替她去往敵國和親偎窘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理溜在,服務(wù)發(fā)現(xiàn)陌知,斷路器,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法掖肋,類相關(guān)的語法仆葡,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法沿盅,線程的語...
    子非魚_t_閱讀 31,587評(píng)論 18 399
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持把篓,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠腰涧,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 2,987評(píng)論 4 14
  • 近年微商做朋友圈里橫起 韧掩, 朋友圈成立微商重地 , 但是沒有幾個(gè)人的朋友圈 整理干凈的 說白了窖铡, 很少有人搞明白微...
    熊芳菲閱讀 566評(píng)論 0 0
  • 1 據(jù)說聰明的人不會(huì)感覺自己聰明费彼,只是覺得其他人反應(yīng)有些慢滑臊。 帥的人也不會(huì)覺得自己有多帥,只是覺得其他人五官排序有...
    脫口岳閱讀 381評(píng)論 0 0