js面向對象

  1. 面向過程:
    注重于流程順序
        1.分析解決問題都需要哪些步驟
        2.將這些步驟一步一步封裝成方法
        3.根據(jù)業(yè)務邏輯,將方法依次調(diào)用
  1. 面向對象:oop
  Object Oriented Programming 
  對象   面向    編程
 核心思想:關注的是 以事務為中心 提取順序流程中的參與者(對象) 將各個流程順序進行劃分。
編寫到各個參與者的方法里面唬复,各自按照約定好的順序后豫,執(zhí)行各自的流程順序歧寺,來共同完成一個業(yè)務邏輯

對象的范疇:萬物萬事皆對象
對象的特征: 屬性
對象的行為:方法
在程序上萤皂,對象是一組行為和特征的數(shù)據(jù)集和

常見對象:標簽對象 BOM對象 系統(tǒng)內(nèi)置對象
window history localStorage 系統(tǒng)內(nèi)置對象函數(shù) 本身也是一個對象
人為定義的對象

 // 系統(tǒng)內(nèi)置 new Object()創(chuàng)建空對象 
        var obj = new Object();
        console.log(obj);
        // 字面量的形式創(chuàng)建對象
        var obj1 = {};
        console.log(obj1);
        console.log([obj1]);

        // 對象是屬性和方法的集合
        // 給對象動態(tài)添加方法
        obj.name = '文文' //添加屬性
        obj['say'] = function () { //添加方法
            console.log('hello world');
        }
        obj1['name'] = '劉';
        obj1['say'] = function () {
            console.log('000');
        }
        console.log(obj);
        // 系統(tǒng)對象
        var arr = new Array();
        var str = new String();
        var num = new Number();
        var bool = new Boolean();
  1. 構造方法創(chuàng)建對象
    // 通過構造函數(shù)來寫一個人的類
    function Person(name, age) {
        this.name = name || '小';
        this.age = age || 0;
        this.say = function() {
                console.log(this.age);
                console.log('hello world');
            }
            // 如果構造函數(shù)里面返回this,則這個this代表window對象
            // return this;
    }
    // 創(chuàng)建對象

    var p1 = new Person('小明', '3')
    console.log(p1);
  1. js對象的產(chǎn)生
    對象抽象成類妆绞,類實例化成對象
    直觀上來說:通過new產(chǎn)生的 類的實例化
    JS中所有的對象顺呕,都是由一個原型對象拷貝自己產(chǎn)生的
    獲取當前對象的原型對象:Object.getPrototype(要檢查的對象)
 // 原型的屬性和方法的訪問
    function Animal() {
        this.name = '小明';

    }
    // 實例化對象
    var a1 = new Animal();
    console.log(a1.name);
    console.log(a1);
    Animal.prototype.type = 'dog';
    Animal.prototype.name = '大明';
    var a2 = new Animal()
    console.log(a2);
    console.log(a2.type);
    a2.type = 'cat'
    console.log(a2);
    console.log(Animal.prototype.type);
對象在訪問屬性和調(diào)用方法時,首先會在自己的屬性和方法上面查找
如果能找到括饶,直接調(diào)用株茶,未找到,就去原型對象上找图焰,找到后執(zhí)行

對象對于原型對象的屬性和方法是只讀操作启盛,無法修改原型對象的屬性和方法
如果給對象設置跟原型對象一樣的屬性名和方法
相當于給對象本身設置了一個新的屬性和方法,并且與原型的屬性和方法重名
之后訪問這個重名的屬性和方法技羔,就只能訪問到自身僵闯,而不能直接訪問到原型
  1. 多態(tài)
    多態(tài):利用面向對象解決switch case
    執(zhí)行同一個方法,傳入的對象不一樣藤滥,輸出的結果不一樣
        分離的思想:
            將程序中變化的部分和不變的部分分離
            將變化的部分當做參數(shù)傳入函數(shù)
            在函數(shù)內(nèi)部將相同部分的對象方法調(diào)用
            根據(jù)不同的對象自動輸出不同的結果
            盡可能的消除了分支語句鳖粟,方便系統(tǒng)的擴展
    function Dog() {
        this.say = function() {
            console.log('汪汪');
        }
    }

    function Cat() {
        this.say = function() {
            console.log('喵喵');
        }
    }

    function Cattle() {
        this.say = function() {
            console.log('哞哞');
        }
    }

    function Sheep() {
        this.say = function() {
            console.log('咩咩');
        }
    }

    // 調(diào)用方法
    function makeSound(obj) {
        obj.say()
    }
    var d1 = new Dog();
    makeSound(d1)
    var d2 = new Cat();
    makeSound(d2)
  1. 繼承
// 繼承
    function Person() {
        this.type = '人';
        this.name = '123';
        this.age = 18;
        this.say = function() {
            console.log('hi');
        }
    }

    function Man() {
        this.sex = 1;
    }
    // 相當于Person實例化一個對象,覆蓋掉Man的原型對象
    // 未覆蓋前拙绊,Man的原型對象構造函數(shù)指向Man
    // 覆蓋后向图,Man.prototype.constructor指向Person
    // 所以需要將其改寫回來,重新指向Man
    Man.prototype = new Person(); //指向person
    Man.prototype.constructor = Man //改寫回來指向自己
    var m1 = new Man()
    console.log(m1);
    console.log(Man.prototype.constructor);
    console.log(m1.name); //可使用person的屬性

    function Kids() {
        this.age = 3;
    }
    Kids.prototype = new Man()
    Kids.prototype.constructor = Kids
    var k1 = new Kids()
    console.log(k1.type); //可使用person标沪、man的屬性
    console.log(k1.age);
   // 構造函數(shù)式繼承
    function Person(name, age) {
        this.name = name;
        this.age = age;
        console.log('111');
    }
    // 使用apply和call功能幾乎一樣榄攀,區(qū)別參數(shù)的形式不同
    // call可以有多個參數(shù),第一個參數(shù)是指向的對象谨娜,其余參數(shù)為實參
    // apply只有兩個參數(shù)航攒,第一個參數(shù)是指向的對象,第二個參數(shù)是實參數(shù)組
    function Man(name, age) {
        // Person.call(this, name, age)
        Person.apply(this, [name, age]) //改變this指向person
        this.sex = 1;
    }
    var m1 = new Man(2, 3)
    console.log(m1);
    m1.age = 0
    console.log(m1.age);
  1. 封裝
    面向對象封裝的特性
    js面向對象 封裝方法是通過構造函數(shù)來實現(xiàn)的
    封裝優(yōu)點:1.數(shù)據(jù)隱藏 可以將代碼中敏感的算法趴梢、變量漠畜、常量,隱藏在對象的私有變量中坞靶,僅供內(nèi)部使用
            2.安全性 強制通過自定義的方法 來實現(xiàn)內(nèi)部和外部的數(shù)據(jù)交互 達到數(shù)據(jù)過濾的效果
                一般來說憔狞,設置通常用  ...+setter+...來命名方法
                         獲取通常用  ...+getter+...來命名方法
// 定義一個構造函數(shù)
    function Home() {
        // 私有屬性
        var money;
        // 公共屬性
        this.name = 'qwqq'
            // 公共方法
        this.Asetter = function() {
            var num = rand(500, 5000)
            money = num;
        }
        this.Agetter = function() {
                return money - 500;
            }
            // 私有方法
        function rand(min, max) {
            return Math.round(Math.random() * (max - min) + min)
        }

        // 數(shù)據(jù)隱藏
        this.age = 0;
        this.ageChange = function(n) {
            this.age = n;
        }
    }
    var h1 = new Home()
    h1.Asetter();
    console.log(h1.Agetter());
    console.log(h1.money);

    // 數(shù)據(jù)隱藏
    console.log(h1.ageChange(20));

    // 封裝初始化傳參
    function Person(options) {
        options = options || {}
        this.name = options.name
        this.age = options.age
        this.say = options.say
    }
    var p1 = new Person({
        name: '123',
        age: 4,
        say: function() {
            console.log('hi');
        }
    })
    console.log(p1);
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市彰阴,隨后出現(xiàn)的幾起案子瘾敢,更是在濱河造成了極大的恐慌,老刑警劉巖尿这,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簇抵,死亡現(xiàn)場離奇詭異,居然都是意外死亡射众,警方通過查閱死者的電腦和手機碟摆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叨橱,“玉大人典蜕,你說我怎么就攤上這事断盛。” “怎么了愉舔?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵钢猛,是天一觀的道長。 經(jīng)常有香客問我轩缤,道長命迈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任火的,我火速辦了婚禮躺翻,結果婚禮上,老公的妹妹穿的比我還像新娘卫玖。我一直安慰自己公你,他們只是感情好,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布假瞬。 她就那樣靜靜地躺著陕靠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脱茉。 梳的紋絲不亂的頭發(fā)上剪芥,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天,我揣著相機與錄音琴许,去河邊找鬼税肪。 笑死,一個胖子當著我的面吹牛榜田,可吹牛的內(nèi)容都是我干的益兄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箭券,長吁一口氣:“原來是場噩夢啊……” “哼净捅!你這毒婦竟也來了?” 一聲冷哼從身側響起辩块,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛔六,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后废亭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體国章,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年豆村,在試婚紗的時候發(fā)現(xiàn)自己被綠了液兽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡你画,死狀恐怖抵碟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坏匪,我是刑警寧澤拟逮,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站适滓,受9級特大地震影響敦迄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凭迹,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一罚屋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嗅绸,春花似錦脾猛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚀狰,卻和暖如春愉昆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背麻蹋。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工跛溉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扮授。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓芳室,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刹勃。 傳聞我的和親對象是個殘疾皇子渤愁,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

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

  • 1. 面向過程: 注重于流程順序 2. 面向對象:oop 對象的范疇:萬物萬事皆對象對象的特征: 屬性對象的行為:...
    晴空0_0閱讀 158評論 0 0
  • 上一篇講到js實現(xiàn)對類對封裝,本篇介紹類的繼承深夯,多態(tài)抖格。 類的繼承 類式繼承 類式繼承方式是將父類的實例賦在子類的原...
    鏡軒夕照閱讀 561評論 0 3
  • 寫在前面 既然是淺談,就不會從原理上深度分析咕晋,只是幫助我們更好地理解... 面向對象與面向過程 面向對象和面向過程...
    grain先森閱讀 495評論 0 3
  • 面向對象的特性: 封裝 繼承 多態(tài) 封裝作用:方便代碼的維護雹拄,提高代碼的復用性,更安全的訪問數(shù)據(jù)的方式注意:js中...
    檸檬糖閱讀 275評論 1 3
  • JS面向對象 oop 繼承:實例可以繼承A對象中的方法和屬性掌呜,減少代碼冗余 封裝:對象把實現(xiàn)過程封裝在方法中滓玖,調(diào)用...
    Taco_King閱讀 440評論 0 0