個人筆記——面向?qū)ο?對象_原型_繼承)

紅寶書第四版误墓,面對對象的重點,精華濃縮版,送給大家方篮,其中有部分是個人見解,歡迎指正

歡迎加我技術(shù)交流群 :811956471

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
        <title>對象_原型_繼承</title>
    </head>
    <body>
        注解:person是構(gòu)造函數(shù)Person的實例對象励负。

        1.hasOwnProperty():
        -- 用于確定某個實例屬性或方法是在實例上還是在原型對象上,在實例上返回true藕溅,它會忽略那些從原型鏈上繼承的屬性;
        -- 語法:object.hasOwnProperty('屬性名稱')继榆、如person.hasOwnProperty("name")巾表;

        2.in 操作符:
        -- 無論查找的屬性或方法是在原型上還是在實例上都返回true汁掠;
        -- 語法 :屬性名 in 實例對象、如: "name" in person;

        3.isPrototypeOf():
        -- 檢測一個對象是否存在另一個對象的原型鏈上(判斷要檢查其原型鏈的對象是否存在于指定對象實例中集币,是返回true考阱,否返回fals);
        -- 語法:object1.isPrototypeOf(Object2)鞠苟、如:Person.prototype.isPrototypeOf(person)乞榨;

        4.instanceof 
        -- 檢測構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個實例對象的原型鏈上。
        -- 語法:object instanceof constructor  当娱, object為某個實例對象吃既,constructor為某個構(gòu)造函數(shù)

    </body>
    <script type="text/javascript">
        /*一、工廠模式:
        1.1沒有解決對象標(biāo)識問題(即新創(chuàng)建的對象是什么類型)
        */
        function createObj(name, age) {
            let o = new Object();
            o.name = name;
            o.age = age;
            return o
        }


        let getObj1 = createObj("Greg", 27);
        let getObj2 = createObj("諸葛亮", 26);
        console.log(getObj1 instanceof createObj) //false
        console.log(getObj2 instanceof createObj) //false


        /*二跨细、
        2.1構(gòu)造函數(shù)模式:
        無參可省去括號:let person1 = new Person()等同于let person2 = new Person;
        a.優(yōu)勢:相比于工廠模式鹦倚、可以區(qū)分實例是來自哪個構(gòu)造函數(shù);
        b.問題:其定義的方法會在每個實例上都創(chuàng)建一遍:下面person1 和 person2 都有名為 sayName()的方法扼鞋,
               但這兩個方法不是同一個 Function 實例,因此,person1.sayName != person2.sayName
        */
        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.sayName = function() {
                console.log(this.name);
            };
        }

        function Tree() {};

        let person1 = new Person("Greg1", 27);
        let person2 = new Person("Tom", 27);
        let person3 = new Tree();
        console.log(person1 instanceof Object); // true 申鱼,person1被認(rèn)為是Object實例,是因為所有自定義對象都繼承自O(shè)bject

        console.log(person1 instanceof Person) //true
        console.log(person2 instanceof Person) //true
        console.log(person3 instanceof Person) //false

        /*
        2.2:解決構(gòu)造函數(shù) :
        其定義的方法會在每個實例上都創(chuàng)建一遍問題 :
        這樣雖然解決了相同邏輯的函數(shù)重復(fù)定義的問題云头,但全局作用域也因此被搞亂了捐友,因為那個函數(shù)實際上只能在一個對象上調(diào)用。如果這個對象需要多個方法,
        那么就要在全局作用域中定義多個函數(shù)溃槐。這會導(dǎo)致自定義類型引用的代碼不能很好地聚集一起匣砖。這個新問題可以通過原型模式來解決。
        */
        function Person(name, age) {
            this.name = name;
            this.age = age;
            this.sayName = sayName
        }

        function sayName() {
            console.log(99, this.name);
        };
        let personTest = new Person("Greg1", 27);
        person66.personTest('諸葛', 20)


        /* 三昏滴、
        3.1原型模式
         a.每個函數(shù)都會創(chuàng)建一個 prototype 屬性猴鲫,這個屬性是一個對象,包含應(yīng)該由特定引用類型的實例共享的屬性和方法谣殊。對象就是通過調(diào)用構(gòu)造函數(shù)創(chuàng)建的對象的原型
         b.解決構(gòu)造函數(shù)存在的問題:使用這種原型模式定義的屬性和方法是由所有實例共享的,其定義的方法不會重復(fù)創(chuàng)建
         c.原型存在的問題:無法傳遞初始化參數(shù)拂共,導(dǎo)致所有實例默認(rèn)都取得相同的屬性值,當(dāng)有引用值的屬性時姻几,其中一個實例修改原型上這個引用值時另外一個實例原型也會跟著改變
         */
        function Person() {}
        Person.prototype.name = '諸葛';
        Person.prototype.sayName = function() {
            console.log(this.name)
        }
        let person1 = new Person();
        let person2 = new Person();
        console.log(person1.sayName == person2.sayName); // true

        /*
        3.2原型模式--重寫原型:
        a.可以看到宜狐、每次定義一個屬性或方法都會把 Person.prototype 重寫一遍
        b.為了減少代碼冗余,因此:
        */
        function Person() {}
        Person.prototype = {
            name: "Nicholas",
            sayName() {
                console.log(this.name);
            }
        };
        // 這樣重寫之后,Person.prototype 的 constructor 屬性就不指向 Person蛇捌,而是指向了Object,解決這個問題抚恒,可以:
        Person.prototype = {
            name: "Nicholas",
            constructor: Person,
            sayName() {
                console.log(this.name);
            }
        };


        /*
        3.3原型模式--重寫原型之原型的動態(tài)性:
        未重寫原型之前,無論是先實例络拌,還是先給原型添加屬性和方法俭驮,實例都可以訪問到原型上的屬性方法
        */
        let friend = new Person();
        Person.prototype.sayHi = function() {
            console.log("hi");
        };
        friend.sayHi(); // "hi",可以訪問到春贸,沒問題混萝!

        /*
        3.4原型模式--重寫原型之原型的動態(tài)性:
        重寫原型之后遗遵,如果先實例,這個實例不能訪問到原型上的屬性方法譬圣,重寫整個原型會切斷最初原型與構(gòu)造函數(shù)的聯(lián)系
        */
        let friend = new Person();
        Person.prototype = {
            constructor: Person,
            name: "Nicholas",
        };
        friend.sayName(); // 錯誤瓮恭,無法訪問到


        /* 四、繼承:
         javascript的繼承是通過原型鏈實現(xiàn)
        */
        /* 4.1厘熟、繼承之原型鏈:
        a.原型鏈概念:利用原型讓一個引用類型繼承另一個引用類型的屬性和方法屯蹦。然后層層遞進(jìn),就構(gòu)成了實例與原型的鏈條绳姨,這就是所謂原型鏈登澜。
        b.原型鏈存在問題:
          --子類型在實例化時不能給父類型的構(gòu)造函數(shù)傳參;
          --原型中包含引用值的時候,引用類型在實例中指向同一個地址飘庄,無法獨立
        */
        function Parent() {
            this.colors = ['red', 'green']
        }

        function Son() {}
        Son.prototype = new Parent();
        let son1 = new Son();
        son1.colors.push('blue');
        console.log(son1.colors) //["red", "green", "blue"]
        let son2 = new Son();
        console.log(son2.colors) //["red", "green", "blue"]


        /* 4.2脑蠕、盜用構(gòu)造函數(shù):
        -- 解決原型包含引用值導(dǎo)致的繼承問題
        -- 缺點:須在構(gòu)造函數(shù)中定義方法、函數(shù)不能重用跪削、子類也不能訪問父類原型上定義的方法
        */
        function Parent(name = '諸葛亮') {
            this.name = name;
            this.colors = ['red', 'green']
        };
        Parent.prototype.sayName = function() {
            console.log(this.name)
        };

        function Son() {
            Parent.call(this, '劉備')
        }

        let son1 = new Son();
        son1.colors.push('blue');
        console.log(son1.sayName()); //undefined


        /* 4.3谴仙、組合繼承(偽經(jīng)典繼承):
        -- 解決盜用構(gòu)造函數(shù)繼承問題
        -- 組合繼承彌補了原型鏈和盜用構(gòu)造函數(shù)的不足,是 JavaScript 中使用最多的繼承模式碾盐。而且組合繼承也保留了 instanceof 操作符和 isPrototypeOf() 方法識別合成對象的能力
        */

        function Parent(name = '諸葛亮') {
            this.name = name;
            this.colors = ['red', 'green']
        };
        Parent.prototype.sayName = function() {
            console.log(this.name)
        };

        function Son(name) {
            // 繼承屬性
            Parent.call(this, name)
        }
        // 繼承方法
        Son.prototype = new Parent();
        let son1 = new Son('劉備');
        son1.colors.push('blue');
        console.log(son1.sayName()); //劉備


        /* 4.4晃跺、原型式繼承:
        -- 本質(zhì)是執(zhí)行了一次淺復(fù)制,和原型鏈存在問題的是一樣的毫玖,問題見:四掀虎、4.1  
        -- 下面是例子:可以看到,最后他們引用類似對象是同一個了付枫,引用對象繼承無法各自獨立
        -- 自定義的object()方法等同于es5新增的Object.create() 方法
        */

        function object(o) {
            function F() {}
            F.prototype = o;
            return new F();
        }

        let person = {
            name: "Nicholas",
            friends: ["Shelby", "Court", "Van"]
        };
        let anotherPerson = object(person);

        anotherPerson.name = "Greg";
        anotherPerson.friends.push("Rob");

        let yetAnotherPerson = object(person);

        yetAnotherPerson.name = "Linda";
        yetAnotherPerson.friends.push("Barbie");

        console.log(person.friends); // "Shelby,Court,Van,Rob,Barbie" 
        
        /* 4.5烹玉、寄生式繼承:
        -- 通過寄生式繼承給對象添加函數(shù)會導(dǎo)致函數(shù)難以重用,與構(gòu)造函數(shù)模式類似
        */
        
        
        /* 4.6阐滩、寄生式組合繼承:
        -- 寄生式組合繼承通過盜用構(gòu)造函數(shù)繼承屬性二打,但使用混合式原型鏈繼承方法,基本思路是不通過調(diào)用父類構(gòu)造函數(shù)給子類原型賦值掂榔,而是取得父類原型的一個副本
        --子類原型最終包含超類對象的所有實例屬性址儒,子類構(gòu)造函數(shù)只要在執(zhí)行時重寫自己的原型就行了
        */
        // 4、寄生組合式繼承
        function inheritPrototype(subType, superType) {
            var myprototype = Object(superType.prototype); //創(chuàng)建對象
            myprototype.constructor = subType; //增強對象
            subType.prototype = myprototype; //指定對象
        }
        
        function SuperType(name) {
            this.name = name;
            this.colors = ["red", "blue", "green"];
        }
        SuperType.prototype.sayName = function() {
            console.log(this.name);
        };
        
        function SubType(name, age) {
            SuperType.call(this, name);
            this.age = age;
        }
        inheritPrototype(SubType, SuperType);
        SubType.prototype.sayAge = function() {
            console.log(this.age);
        };
        
        let sub1 = new SubType('諸葛亮', 36)
        console.log(sub1);
        
    </script>
</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衅疙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸳慈,更是在濱河造成了極大的恐慌饱溢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件走芋,死亡現(xiàn)場離奇詭異绩郎,居然都是意外死亡潘鲫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門肋杖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溉仑,“玉大人,你說我怎么就攤上這事状植∽蔷梗” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵津畸,是天一觀的道長振定。 經(jīng)常有香客問我,道長肉拓,這世上最難降的妖魔是什么后频? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮暖途,結(jié)果婚禮上卑惜,老公的妹妹穿的比我還像新娘。我一直安慰自己驻售,他們只是感情好露久,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著芋浮,像睡著了一般抱环。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天畏腕,我揣著相機與錄音立莉,去河邊找鬼。 笑死梯啤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的存哲。 我是一名探鬼主播因宇,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼祟偷!你這毒婦竟也來了察滑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤修肠,失蹤者是張志新(化名)和其女友劉穎贺辰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡饲化,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年莽鸭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吃靠。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡硫眨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出巢块,到底是詐尸還是另有隱情礁阁,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布夕冲,位于F島的核電站氮兵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏歹鱼。R本人自食惡果不足惜泣栈,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弥姻。 院中可真熱鬧南片,春花似錦、人聲如沸庭敦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秧廉。三九已至伞广,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疼电,已是汗流浹背嚼锄。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔽豺,地道東北人区丑。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像修陡,于是被迫代替她去往敵國和親沧侥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355