構(gòu)造函數(shù)模式-拓展

先看如下構(gòu)造函數(shù)

    function Fn() {
        // this -> f1
        this.x = 100;
        this.getX = function () {
            // this -> 需要看getX執(zhí)行的時候才知道
            console.log(this.x);
        }
    }
    var f1 = new Fn; // -> 此處()可省略
    f1.getX(); // 方法中的this -> f1 -> 100
    var ss = f1.getX;
    ss(); // this -> window -> undefined
  1. 在構(gòu)造函數(shù)模式中,new Fn執(zhí)行,如果Fn中不需要傳遞參數(shù)的話,后面的"()"可以省略。

  2. this的問題: 在類中出現(xiàn)的this.xxx = xxx; 中的this都是當(dāng)前類的實例,而某一個屬性值(方法),方法中的this需要看方法執(zhí)行的時候,前面是否有".",才能知道this是誰。

  1. 類有普通函數(shù)的一面,當(dāng)函數(shù)執(zhí)行的時候,var num 其實只是當(dāng)前形成的私有作用域中的私有變量而已,它和我們的f1這個實例沒有任何的關(guān)系;只有this.xxx = xxx;才相當(dāng)于f1這個實例增加了私有的屬性和方法,才和f1有關(guān)系。
    function Fn() {
        var num = 10;
        this.x = 100; // f1.x = 100;
        this.getX = function () { // f1.getx = function() {...}
            console.log(this.x);
        }
        return 100;
        return {a: '1'};
    }
    var f1 = new Fn();
    console.log(f1.num); // undefined
  1. 在構(gòu)造函數(shù)模式中,瀏覽器會默認的把實例返回(返回的是一個對象數(shù)據(jù)類型);如果我們自己手動寫了return返回,這是分為兩種情況:
    第一種情況: 是返回的是基本數(shù)據(jù)類型,那么當(dāng)前的實例是不會改變的,例如return 100;此時f1還是Fn()類的實例。
    第二種情況: 如果返回的是引用數(shù)據(jù)類型的值,當(dāng)前的實例會被返回的引用數(shù)據(jù)替換了,例如return {a: '1';}, 此時f1就不再是Fn()的實例了,而是 {a: '1'};。
console.log(f1);
  1. 檢測某一個實例是否屬于這一個類,可以使用instanceof
    console.log(f1 instanceof Fn); // -> true
    console.log(f1 instanceof Array); // -> false
    console.log(f1 instanceof Object); // -> true 因為所有的實例都是對象數(shù)據(jù)類型的
    // 而每一個對象數(shù)據(jù)類型,而每一個對象數(shù)據(jù)類型都是Object這個內(nèi)置類的一個實例,所以f1也是它的一個實例
    // 對于檢測數(shù)據(jù)類型來說,typeof有自己的局限性,它不能細分Object下的對象、數(shù)組、正則等。
    var a = [];
    console.log(a instanceof Array); // -> true 說明a是一個數(shù)組
    function Fn() {
        this.x = 100;
        this.getX = function () {
            console.log(this.x);
        }
    }
    var f1 = new Fn();
    var f2 = new Fn();
  1. f1和f2都是Fn這個類的一個實例,都擁有x和getX兩個屬性,但是這兩個屬性是各自的私有的屬性,所以:
    console.log(f1.getX === f2.getX); // -> false
    // in: 檢測某一個屬性是否屬于這個對象,attr in object,不管是私有的還是公有的屬性,只要存在,用in來檢測都是true
    console.log('getX' in f1); // true -> 是它的屬性
    // hasOwnProperty: 用來檢測某一個屬性是否為這個對象的"私有屬性",這個方法只能檢測私有的屬性
    console.log(f1.hasOwnProperty('getX')); // true

思考:檢測某一個屬性是否是該對象的"公有屬性"?

    function hasPublicProperty(obj, attr) {
        if (attr in obj && !obj.hasOwnProperty(attr)) {
            return true;
        }
        return false;
    }
    console.log(hasPublicProperty(f1, 'getX')); // -> false
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實現(xiàn)同樣的效果;這時候需要使用工廠模式。簡單...
    舟漁行舟閱讀 8,118評論 2 17
  • 構(gòu)造函數(shù)模式的目的:是為了創(chuàng)建一個自定義類,并且創(chuàng)建這個類的實例 構(gòu)造函數(shù)模式與工廠模式區(qū)別: 1、執(zhí)行的時候: ...
    gaoqizhuhui閱讀 269評論 0 0
  • 首先看基于原型鏈的構(gòu)造函數(shù)形式: 構(gòu)造函數(shù)模式中擁有了類和實例的概念,并且實例和實例之間是相互獨立開來的 -> 實...
    阿九是只大胖喵閱讀 343評論 0 0
  • 以前總愛說,真正關(guān)系好的,無論隔了多久彼此過著無論怎樣不同的生活,只要一見面一開口,又是無話不談心心相惜。 喜歡的...
    饃角閱讀 326評論 0 0

友情鏈接更多精彩內(nèi)容