1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        JavaScript系列之面向?qū)ο?/h1>

        共 5052字,需瀏覽 11分鐘

         ·

        2020-09-18 18:02

        作者: __?mxin

        來源:SegmentFault 思否社區(qū)




        什么是面向?qū)ο螅?/span>


        概念起源


        面向?qū)ο蟪绦蛟O(shè)計(jì)的雛形,早在1960年的 Simula 語(yǔ)言中即可發(fā)現(xiàn),當(dāng)時(shí)的程序設(shè)計(jì)領(lǐng)域正面臨著一種危機(jī):在軟硬件環(huán)境逐漸復(fù)雜的情況下,軟件如何得到良好的維護(hù)?面向?qū)ο蟪绦蛟O(shè)計(jì)在某種程度上通過強(qiáng)調(diào)可重復(fù)性解決了這一問題。--引自維基百科




        面向?qū)ο螅∣OP)


        面向?qū)ο缶幊淌且猿橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式;在此種模式下將對(duì)象作為擁有明確職責(zé)的基本單元,對(duì)象本身可以接收消息,處理數(shù)據(jù)以及發(fā)送數(shù)據(jù)給其他對(duì)象;OOP 有以下幾點(diǎn)特性:


        • Inheritance 繼承
          • 子類可以繼承父類的特征(屬性和方法)? ??
        • Encapsulation 封裝
          • 是一種把數(shù)據(jù)和相關(guān)的方法綁定在一起使用的方法
        • Abstraction 抽象
          • 結(jié)合復(fù)雜的繼承,屬性,方法的對(duì)象能夠模擬現(xiàn)實(shí)的模型
        • Polymorphism 多態(tài)
          • 不同類可以定義相同的屬性和方法




        基于原型和基于類


        基于原型的編程提倡我們?nèi)リP(guān)注一系列對(duì)象實(shí)例的行為,而后才去關(guān)心如何將這些對(duì)象,劃分到最近的使用方式相似的原型對(duì)象,而不是將它們分成類


        • 基于原型的面向?qū)ο笙到y(tǒng)通過復(fù)制的方式來創(chuàng)建新對(duì)象一些語(yǔ)言的實(shí)現(xiàn)中,還允許復(fù)制一個(gè)空對(duì)象,這實(shí)際上就是創(chuàng)建一個(gè)全新的對(duì)象

        原型系統(tǒng)的“復(fù)制操作”有兩種實(shí)現(xiàn)思路:

        1. 并不真的去復(fù)制一個(gè)原型對(duì)象,而是使得新對(duì)象持有一個(gè)原型的引用
        2. 切實(shí)地復(fù)制對(duì)象,從此兩個(gè)對(duì)象再無關(guān)聯(lián)

        基于類的編程提倡使用一個(gè)關(guān)注分類和類之間關(guān)系開發(fā)模型

        • 在這類語(yǔ)言中,總是先有類,再?gòu)念惾?shí)例化一個(gè)對(duì)象
        • 類與類之間又可能會(huì)形成繼承、組合等關(guān)系
        • 類又往往與語(yǔ)言的類型系統(tǒng)整合,形成一定編譯時(shí)的能力


        基于原型和基于類的區(qū)別




        面向?qū)ο笳Z(yǔ)言中都有類的概念,如 Java、C++ 都是基于類的語(yǔ)言,而 JavaScript 是基于原型的語(yǔ)言,在舊的 ES 版本沒有類的定義,所以我們要做一系列模擬類的操作去定義類


        ES6中提供了 class ,使我們不用再去模擬類的操作,但是這個(gè) class 并非真正的類,其實(shí)是基于原型繼承方式的語(yǔ)法糖


        function Person() { }// 或var Person = function(){ }// 或class Person{ }


        構(gòu)造函數(shù)


        在實(shí)例化時(shí)構(gòu)造函數(shù)被調(diào)用 (也就是對(duì)象實(shí)例被創(chuàng)建時(shí))


        構(gòu)造函數(shù)是對(duì)象中的一個(gè)方法
        在 JavaScript 中函數(shù)就可以作為構(gòu)造器使用,因此不需要特別地定義一個(gè)構(gòu)造器方法,每個(gè)聲明的函數(shù)都可以在實(shí)例化后被調(diào)用執(zhí)行(在ES6規(guī)范中 class 內(nèi)的 constructor 起到同樣的作用)


        構(gòu)造器常用于給對(duì)象的屬性賦值或者為調(diào)用函數(shù)做準(zhǔn)備


        function Person(name) {  this.name = name  alert('Person instantiated')}// 或class Person{  constructor(name){    this.name = name    alert(`Person instantiated`)  }}
        var person = new Person('mxin');

        JavaScript對(duì)象


        對(duì)象在計(jì)算機(jī)中是一個(gè)具有唯一標(biāo)識(shí)的內(nèi)存地址,參考 Grandy Booch 的《面向?qū)ο蠓治雠c設(shè)計(jì)》來看,對(duì)象具有下列幾個(gè)特點(diǎn):


        • 唯一標(biāo)識(shí)性:即使完全相同的兩個(gè)對(duì)象,也并非同一個(gè)對(duì)象
        • 狀態(tài):對(duì)象具有狀態(tài),同一對(duì)象可能處于不同狀態(tài)之下
        • 行為:即對(duì)象的狀態(tài),可能因?yàn)樗男袨楫a(chǎn)生變遷


        唯一標(biāo)識(shí)性


        function Person() { }var person_1 = new Person();var person_2 = new Person();console.log(person_1 == person_2) // false
        const obj_1 = { a: 1 };const obj_2 = { a: 1 };console.log(obj_1 == obj_2); // false


        狀態(tài)和行為


        分別對(duì)應(yīng)了屬性和方法這兩個(gè)概念,在 JavaScript 被抽象為屬性,其屬性可以為任何類型

        const obj = {  name: 'mxin',  age: 99,  getInfo() {    return `name: ${this.name} , age: ${this.age}`  }}



        繼承


        JavaScript 通過將構(gòu)造函數(shù)與原型對(duì)象相關(guān)聯(lián)的方式來實(shí)現(xiàn)繼承,下面將以 ES5 及 ES6 兩種方式展示

        • ES5
        // 定義Person構(gòu)造器function Person(firstName) {    this.firstName = firstName;  }
        // 在Person.prototype中加入方法 Person.prototype.walk = function(){ console.log("I am walking!"); }; Person.prototype.sayHello = function(){ console.log("Hello, I'm " + this.firstName); };
        // 定義Student構(gòu)造器 function Student(firstName, subject) { // 調(diào)用父類構(gòu)造器, 確保(使用Function#call)"this" 在調(diào)用過程中設(shè)置正確 Person.call(this, firstName);
        // 初始化Student類特有屬性 this.subject = subject; };
        // 建立一個(gè)由Person.prototype繼承而來的Student.prototype對(duì)象. // 注意: 常見的錯(cuò)誤是使用 "new Person()"來建立Student.prototype. // 這樣做的錯(cuò)誤之處有很多, 最重要的一點(diǎn)是我們?cè)趯?shí)例化時(shí) // 不能賦予Person類任何的FirstName參數(shù) // 調(diào)用Person的正確位置如下,我們從Student中來調(diào)用它 Student.prototype = Object.create(Person.prototype); // See note below
        // 設(shè)置"constructor" 屬性指向Student Student.prototype.constructor = Student;
        // 更換"sayHello" 方法 Student.prototype.sayHello = function(){ console.log("Hello, I'm " + this.firstName + ". I'm studying " + this.subject + "."); };
        // 加入"sayGoodBye" 方法 Student.prototype.sayGoodBye = function(){ console.log("Goodbye!"); };
        // 測(cè)試實(shí)例: var student = new Student("Janet", "Applied Physics"); student.sayHello(); // "Hello, I'm Janet. I'm studying Applied Physics." student.walk(); // "I am walking!" student.sayGoodBye(); // "Goodbye!"
        // Check that instanceof works correctly console.log(student instanceof Person); // true console.log(student instanceof Student); // true


        • ES6
        class Person {  constructor(firstName) {    this.firstName = firstName  }
        walk() { console.log(`I am walking!`) }
        sayHello() { console.log(`Hello, I'm ${this.firstName}`) }}
        class Student extends Person { constructor(firstName, subject) { super(firstName) this.subject = subject }
        sayHello() { console.log(`Hello, I'm ${this.firstName}. I'm studying ${this.subject}.`) }
        sayGoodBye() { console.log(`Goodbye!`) }}
        // 測(cè)試實(shí)例:const student = new Student(`Janet`, `Applied Physics`)student.sayHello() // "Hello, I'm Janet. I'm studying Applied Physics."student.walk() // "I am walking!"student.sayGoodBye() // "Goodbye!"
        // Check that instanceof works correctlyconsole.log(student instanceof Person) // trueconsole.log(student instanceof Student) // true


        封裝


        上面例子中Student類雖然不需要知道 Person 類的 walk() 方法是如何實(shí)現(xiàn)的,但是仍然可以使用這個(gè)方法,Student類不需要明確地定義這個(gè)方法,除非我們想改變它,這就叫做封裝


        抽象


        抽象是允許模擬工作問題中通用部分的一種機(jī)制,這可以通過繼承或組合( JavaScript 讓類的實(shí)例是其他對(duì)象的屬性值來實(shí)現(xiàn)組合)來實(shí)現(xiàn):

        JavaScript Function 類繼承自 Object 類(繼承)
        Function.prototype 的屬性是一個(gè) Object 實(shí)例(組合)

        var foo = function(){};
        console.log(foo instanceof Function) // trueconsole.log(foo.prototype instanceof Object) // true


        多態(tài)


        就像所有定義在原型屬性內(nèi)部的方法和屬性一樣,不同的類可以定義具有相同名稱的方法,方法是作用于所在的類中(并且這僅在兩個(gè)類不是父子關(guān)系時(shí)成立)




        總結(jié)


        結(jié)合上面的知識(shí),可以了解到JavaScript一種基于原型設(shè)計(jì)的面向?qū)ο笳Z(yǔ)言,而且JavaScript的對(duì)象操作靈活,是具有高度動(dòng)態(tài)性的屬性集合
        可以深入了解一下基于原型的設(shè)計(jì)思路以及JavaScript對(duì)象模型的細(xì)節(jié)




        參考資料:

        • JavaScript面向?qū)ο蠛?jiǎn)介:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript
        • 對(duì)象模型的細(xì)節(jié):https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model
        • 多繼承:https://zhuanlan.zhihu.com/p/34693209





        點(diǎn)擊左下角閱讀原文,到?SegmentFault 思否社區(qū)?和文章作者展開更多互動(dòng)和交流。

        瀏覽 122
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)

        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            大鸡巴伊人| 日韩成人一区| 色99视频| 亚洲精品成人无码AV在线| 国产欧美日韩在线播放| 91精品国产91久久久久久吃药| 国产精品系列视频| 中文字幕午夜福利| 视频一区在线观看| 一区二区三区在线观看视频| 韩国精品一区二区| 婷婷色在线视频| 久久久久一| 丁香婷婷激情| 五月天三级片| 欧美老女人性| 中文字幕性爱电影| 天堂视频中文在线| AV天堂小说网| 五月激情婷婷基地| 大香蕉av一区二区三区在线观看| 久热精品视频| 拍拍视频| 国产91无码精品秘入口新欢| 国产一区二区三区免费视频| 学生妹一级片| 日一日干一干| 精品无码三级在线观看视频 | 操逼免费| 国产亚洲欧美在线| 色欲插插| 在线无码视频播放| 老熟女一区二区三区| 国产精品欧美一区二区三区苍井空| 欧美精品系列| AV黄页| 久久国产一区二区三区| 永久av| 久久群交| 国产18水真多18精品| 激情五月天激情网| 操逼视频看看| 操逼爆奶网站| 日本欧美一级片| 国产精品探花熟女AV| 成人无码视频在线| 一级毛AA片| 欧美国产综合在线| 男女操逼免费观看| 暗呦罗莉精品一区二区| 欧美成人伦理片网| h片在线观看| 北条麻妃无码在线| 天天色视频| 99精品视频免费观看| www.啪啪| 影音先锋亚洲无码| 奇米影视亚洲春色| 日韩一级黄色视频| 夜夜操夜夜操| 日韩在线视频观看| 日韩Av无码一区二区三区不卡| 成人h在线| 爱搞搞就要搞| 色色婷婷五月天| 日韩a| 无码激情| 色婷婷五月天| 人妻少妇av中文字幕乱码牛牛| 大鸡巴黄色视频免费观看| 又a又黄高清无码视频| 看国产AA免费| 中文字幕在线观看辣文| 欧美日逼小视频| 天天操嫩逼无套视频| 最近中文字幕在线视频| 免费观看久久久| 欧美作爱| 亚洲精品国产精品乱码不卡√香蕉 | 亚洲无码123| 做爰视频毛片蜜桃| 操逼在线播放| AV网站在线播放| 在线观看黄片视频| 激情五月丁香婷婷| 强伦轩人妻一区二区电影| 影音先锋三级| 大香蕉伊人视频| 亚洲91视频| 天堂无线av无码av| 老司机AV91| yy午夜福利| 欧美综合视频在线观看| 西西444WWW无码视频软件功能介绍 | 特黄AAAAAAAA片免费直播| 久久精品视频9| 最近中文字幕在线中文字幕7| 日皮视频在线看| 黄色a视频| 蜜臀久久久久久999| 五月激情网站| 亚洲成人免费| 8050午夜| 成人AV电影在线观看| 成人性视频Aⅴ| 亚洲日韩网站| 日本A∨在线| 亚洲免费AV在线| 成人精品免费无码毛片| 国产精品视频99| 97精品视频在线观看| 日本成人三级片| 亚洲AV无码电影| 天天干,夜夜操| 热久久免费视频| 脓肿是什么原因引起的,该怎么治疗 | 在线看A片| 最新AV在线播放| jizz免费视频| 婷婷综合av| 99热精品免费观看| 欧美成人看片黄a免费看| 亚洲AV中文无码| 91人妻人人澡人人爽人人精品乱| 丁香花小说完整视频免费观看| 亚洲天堂无码视频| 婷婷综合| 淫色人妻网| 人人操人人透| 欧美XX888做受| 中文字幕成人影片| 九九性爱网| 日本精品视频一区二区| 182av| 五月天在线观看| 欧洲一区二区三区| 丁香色婷婷| 黄色激情网站| 成人免看一级a一片| 日韩一级网| 国产精品在线免费观看| 爱爱爱爱视频| 3344在线观看免费下载视频| 日韩成人一区二区三区| 亚洲成人高清无码| 日批视频| 夜夜爽夜夜爽| AV手机天堂| 色婷婷av在线| 特大妓女BBwBBWBBw| 在线看黄网站| 在线观看黄色小视频| 国产操逼网| 精品孕妇一级A片免费看| 中文字幕在线视频无码| 97久久精品| 四虎A片| 丁香婷婷一区二区三区| 91无码精品一区二区| 操逼逼一区二区三区| 人人妻人人玩澡人人爽| 亚洲天堂无| 一本色道久久综合无码人妻软件| 岛国片资源| 国产精品一级片| 成人免费视频性爱| 日本色影院| 俺也来最新色视频| 天天操电影| 中国九九盗摄偷拍偷看| 日韩视频在线免费观看| 大屌av| 黄片网站入口| 91色区| 乖我硬了让老子cao你小视频| 国产精品v| 最新午夜综合福利视频| 成人无码99| 三级大香蕉| 青草视频在线免费观看| 激情网五月天| 欧美日韩国产尤物主播精品| 国产欧美精品AAAAAA片| 99久久国产热无码精品免费 | 色综合久久88色综合天天| 在线免费观看黄色视频| 日韩无修正| 亚洲激情自拍| AV无码观看| 夜夜操天天操| 国产精品自拍视频| 91人妻一区二区三区无不码超满| 99欧美精品| 欧美亚洲三级| 天天干天天拍| 99电影网手机在线观看| 欧美日韩V| 亚洲精品视频免费在线观看| 中文字幕在线观看不卡| 香蕉福利视频| 手机在线成人视频| 中文字幕+乱码+中文乱码91在线观看 | 奶大丰满一乱一视频一区二区三区在 | 欧美日韩高清一区| 手机看片国产| 亚洲免费观看高清完整版在线| 黄色片a| 特级毛片在线观看| 成人免费爱爱视频| 伊人精品A片一区二区三区| 午夜精品久久久久久久| 97精品视频| 大香蕉99热| h片网站在线观看| 成人黄片视频| 亚洲小说图片AV在线| 亚洲AV永久无码精品国产精| 国产三级片AV| 九色影院| 偷偷撸在线| 少妇成人网| 插逼视频网站| 亚洲一级内射| 亚洲激情性爱| 日韩欧美在线一区| 18禁黄色免费网站| 欧美久久久| 精品蜜桃秘一区二区三区观看| 久色亚洲| 91探花视频| 亚洲中文字幕av| 欧美日韩在线视频免费播放| 91超碰大香蕉| 无码一区二区免费| 欧美成人精品无| 国产1级片| 国产在线拍偷自揄拍无码一区二区| 国产大鸡吧| 九九伊人大香蕉| 国产伦精品一区二区三区视频女| 欧美成人A| 午夜精品18码视频国产17c| 精品多人P群无码视频| 亚洲狼友视频| 黄色录像一级片| 午夜福利av在线| 日本黄色片视频| 欧美婷婷五月天| 天天干天天干| 成人无码影院日韩,成人年…| 国产三级AV在线| 果冻传媒A片一二三区| 五月亭亭在线视频| 艹逼在线观看| 日本免费黄色电影| 黄色成人视频网站| 3D动漫精品一区二区在线播放免费 | 狠狠做深爱婷婷久久综合一区| 五月天亚洲色图| 无码一区二区三区免费| 日韩av电影免费在线观看| 91人人操人人| 日韩欧美色图| 久草视频免费在线播放| 欧美高潮视频| 日韩久久网| 亚洲无吗在线播放| av一级| 山东wBBBB搡wBBBB| 精品乱子伦一区二区三区下载 | 婷婷五月在线观看| 人人妻人人澡人人爽久久| 91在线视频免费| 激情综合婷婷| 手机毛片在线播放| 三浦恵子一级婬片A片| 学生妹做爱视频| 国产乱伦精品视频| 无码在线高清| 91工厂露脸熟女| 亚洲网站免费在线观看| 一区二区三区四区免费看| 无码秘人妻一区红中av漫画| 蜜臀久久99精品久久久久久宅男| 人人摸人人插| 在线人妻| 日韩超清无码| 久操免费在线视频| 精品AV无码一区二区三区| 三级黄色免费网站| 日本无码视频在线观看| 思思热这里只有精品| 国产精品黄色片| 中文字幕91| 天天逼网| 一二三区视频| AV天堂国产| 日韩成人三级片| 高hnp| V片免费看|