茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    詳解JavaScript中基于原型prototype的繼承特性
    來(lái)源:易賢網(wǎng) 閱讀:1052 次 日期:2016-07-02 14:05:14
    溫馨提示:易賢網(wǎng)小編為您整理了“詳解JavaScript中基于原型prototype的繼承特性”,方便廣大網(wǎng)友查閱!

    這篇文章主要介紹了詳解JavaScript中基于原型prototype的繼承特性,JavaScript中缺少類等面向?qū)ο蟮闹匾匦?因而談到繼承也顯得十分古怪...需要的朋友可以參考下

    JavaScript 中的繼承比較奇葩,無(wú)法實(shí)現(xiàn)接口繼承,只能依靠原型繼承。

    原型鏈

    原型就是一個(gè)對(duì)象,通過(guò)構(gòu)造函數(shù)創(chuàng)建出來(lái)的實(shí)例會(huì)有指針指向原型得到原型的屬性和方法。這樣,實(shí)例對(duì)象就帶有構(gòu)造函數(shù)的屬性方法和原型的屬性方法,然后將需要繼承的構(gòu)造函數(shù)的原型指向這個(gè)實(shí)例,即可擁有這個(gè)實(shí)例的所有屬性方法實(shí)現(xiàn)繼承。

    看下面演示代碼:

    //聲明超類,通過(guò)構(gòu)造函數(shù)和原型添加有關(guān)屬性和方法

    function Super(){

      this.property = true;

    }

    Super.prototype.getSuperValue = function() {

      return this.property;

    };

    //聲明子類的構(gòu)造函數(shù)

    function SubType() {

      this.subproperty = false;

    }

    //將子類的原型指向超類的實(shí)例,得到超類的一切

    SubType.prototype = new Super();

    SubType.prototype.constructor = SubType;

    SubType.prototype.getSubValue = function(){

      return this.subproperty;

    };

    //由子類創(chuàng)建對(duì)象,測(cè)試是否繼承超類方法和屬性

    var instance = new SubType();

    console.log(instance.getSuperValue());

    所有函數(shù)的默認(rèn)原型都是 Object 的實(shí)例,因此默認(rèn)原型都會(huì)包含一個(gè)內(nèi)部指針,指向 Object.prototype。

    使用 instanceof 和 isPrototypeOf 可以確定原型和實(shí)例的關(guān)系:

    instance instanceof Object;

    Object.prototype.isPrototypeOf(instance);

    使用原型鏈的時(shí)候,需要謹(jǐn)慎的定義方法。子類需要重寫超類型的某個(gè)方法或者擴(kuò)充,一定要放在替換原型的語(yǔ)句后面,這樣才能生效。此外,通過(guò)原型鏈實(shí)現(xiàn)繼承時(shí),不能使用對(duì)象字面量創(chuàng)建原型方法,這樣會(huì)重寫原型鏈:

    ......

    SubType.prototype = new Super();

    SubType.prototype = {

      ....

    };

    這會(huì)更換指針指向新對(duì)象,從而重寫了原型鏈。

    原型鏈的繼承方法是有缺陷的,主要有兩個(gè)問(wèn)題:

    1,來(lái)自包含引用類型值的原型,會(huì)被所有實(shí)例共享。

    前面文章介紹過(guò)包含引用類型值的原型屬性會(huì)被所有實(shí)例共享,一個(gè)實(shí)例修改,其他實(shí)例會(huì)隨之改變,因此需要在構(gòu)造函數(shù)中定義屬性。而原型鏈繼承的時(shí)候,無(wú)論超類中屬性是在構(gòu)造函數(shù)還是原型中定義,全部都變成了實(shí)例對(duì)象被子類繼承,從而對(duì)子類的實(shí)例產(chǎn)生影響。

    2,創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)。

    原型鏈的繼承,直接將子類原型指向超類的實(shí)例,這時(shí)候可以向超類傳遞參數(shù)。但是當(dāng)子類創(chuàng)建實(shí)例的時(shí)候,只能向子類的構(gòu)造函數(shù)傳遞參數(shù),而不能向超類的構(gòu)造函數(shù)傳遞參數(shù)。

    因此實(shí)際應(yīng)用中,很少單獨(dú)使用原型鏈。

    相關(guān)的一些代碼實(shí)踐

    鑒別一個(gè)原型屬性

    function hasPrototypeProperty(object, name) {

      return name in object && !object.hasOwnProperty(name);

    }

    在構(gòu)造函數(shù)中使用原型對(duì)象

    function Person(name) {

      this.name = name;

    }

    Person.prototype = {

      constructor: Person,

      sayName: function () {

        console.log(this.name);

      },

      toString: function() {

      }

    };

    var person1 = new Person('Nicholas');

    var person2 = new Person('Greg);

    console.log(person1 instanceof Person); // true

    console.log(person1.constructor === Person); // true

    console.log(person1.constructor === Object); // false

    console.log(person2 instanceof Person); // true

    console.log(person2.constructor === Person); // true

    console.log(person2.constructor === Object); // false

    對(duì)象繼承

    var person1 = {

      name: 'Nicholas',

      sayName: function () {

        console.log(this.name);

      }

    };

    var person2 = Object.create(person1, {

      name: {

        configurable: true,

        enumerable: true,

        value: 'Greg',

        writable: true

      }

    });

    person1.sayName(); // Nicholas

    person2.sayName(); // Greg

    console.log(person1.hasOwnProperty('sayName')); // true

    console.log(person1.isPropertyOf(person2)); // true

    console.log(person2.hasOwnProperty('sayName')); // false

    模塊模式

    var person = (function () {

      var age = 25;

      function getAge() {

        return age;

      }

      function growOlder() {

        age++;

      }

      return {

        name: 'Nicholas',

        getAge: getAge,

        growOlder: growOlder

      };

    }());

    作用域的構(gòu)造函數(shù)

    function Person(name) {

      this.name = name;

    }

    Person.prototype.sayName = function() {

      console.log(this.name);

    };

    var person1 = Person('Nicholas');

    console.log(person1 instanceof Person); // false

    console.log(typeof person1); // undefined

    console.log(name); // Nicholas

    更多信息請(qǐng)查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機(jī)網(wǎng)站地址:詳解JavaScript中基于原型prototype的繼承特性
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2026上岸·考公考編培訓(xùn)報(bào)班

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號(hào)
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)