91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript面向對象的示例分析

發布時間:2021-09-26 18:10:49 來源:億速云 閱讀:137 作者:小新 欄目:開發技術

這篇文章主要介紹JavaScript面向對象的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    JavaScript原型鏈

    每一個對象都有原型,指向另一個對象,另一個對象也有自己的原型,就這樣由原型的原型構成的鏈條就叫原型鏈。

    JavaScript面向對象的示例分析

    原型鏈的盡頭

    如果一個原型鏈是,沒用盡頭的,那么在查找一原型鏈上不存在的屬性時,就會一直查找下去,存在死循環了。顯然不是這樣的,那么原型鏈的盡頭是什么?

    Object的原型

    頂層原型

    看代碼~

    // obj字面量創建方法類似于 new Object()
    // 那么 obj對象就是Object的一個實例,也就是說obj.__proto__ === Object.prototype
    var obj = {
      name: "fzb",
    };
    // 那么obj.__proto__ 或者 Oject.prototype 的__proto__ 是什么? 答案是: null
    console.log(obj.__proto__); // [Object: null prototype] {}
    console.log(obj.__proto__.__proto__); // null

    [Object: null prototype] {}的特殊之處:

    1、該對象存在原型屬性,只是原型指向了null,就是已經是頂層原型了。

    2、該對象上還存在許多其他的方法,只是不可枚舉,看不到。

    創建Object對象的內存圖

    JavaScript面向對象的示例分析

    上方例子的內存圖

    JavaScript面向對象的示例分析

    Object是所有類的父類

    原型鏈最頂層的原型對象就是Object的原型對象

    例子:

    function Student(sno, name) {
      this.sno = sno;
      this.name = name;
    }
    const stu = new Student(201801, "fzb");
    
    console.log(stu); // Student { sno: 201801, name: 'fzb' }
    console.log(stu.__proto__); // {}
    console.log(stu.__proto__.__proto__); // [Object: null prototype] {}
    
    console.log(Student.__proto__); // {}
    /* ***************后面將具體講解注釋內容***************
     * 為什么不是 Student.__proto__ = [Object: null prototype] {}
     * 是因為 Student.__proto__ = Function.prototype 
     * Function.prototype.__proto__ = Object.prototype = [Object: null prototype] {}
     * ***************后面將具體講解注釋內容***************
     */
    console.log(Student.__proto__.__proto__); // [Object: null prototype] {}

    內存圖:

    JavaScript面向對象的示例分析

    原型鏈實現繼承

    繼承可以重復利用代碼,子類可以使用

    例子:

    function Person() {
      this.name = "fzb";
    }
    
    Person.prototype.running = function () {
      console.log(this.name + "正在跑步~");
    };
    
    function Student(sno) {
      this.sno = sno;
    }
    Student.prototype = new Person();
    // 重寫整個原型對象之后,要重新配置 constructor
    Object.defineProperty(Student.prototype, "constructor", {
      configurable: true,
      enumerable: false,
      writable: true,
      value: Student,
    });
    Student.prototype.studying = function () {
      console.log(this.name + "正在學習");
    };
    
    const stu = new Student(201801);
    stu.running(); // fzb正在跑步~
    stu.studying(); // fzb正在學習

    內存圖:

    JavaScript面向對象的示例分析

    缺陷

    1> 在打印子類對象時,有些屬性本應該打印出來的,但是因為在父類上,無法打印出來。

    2> 多個子類對象在進行某些操作時,會出現相互影響。

    // 在上方例子上,加一點點代碼,
    function Person() {
      this.name = "fzb";
      this.friends = []; // 增加一個屬性
    }
    const stu1 = new Student(201801);
    stu1.friends.push("zzw");
    const stu2 = new Student(201801);
    console.log(stu2.friends); // [ 'zzw' ]
    // stu2上取到了stu1的friends屬性,這是不可以的

    3> 無法傳遞參數,有些屬性存在父類構造函數內,子類實例化時,初始化參數無法傳入到父類。

    借用構造函數實現繼承

    在子類構造函數內,調用構造函數。使改變父類構造函數內的this指向,然后父類在this上添加的屬性就會在子類實例化的對象上。

    function Person(name) {
      this.name = name;
      this.friends = [];
    }
    
    Person.prototype.running = function () {
      console.log(this.name + "正在跑步~");
    };
    
    function Student(sno, name) {
      Person.call(this, name); // 添加代碼
      this.sno = sno;
    }
    Student.prototype = new Person();
    // 重寫整個原型對象之后,要重新配置 constructor
    Object.defineProperty(Student.prototype, "constructor", {
      configurable: true,
      enumerable: false,
      writable: true,
      value: Student,
    });
    Student.prototype.studying = function () {
      console.log(this.name + "正在學習");
    };
    
    const stu1 = new Student(201801,"stu1");
    stu1.friends.push("zzw");
    const stu2 = new Student(201802,"stu2");
    console.log(stu2.friends); // []

    這時原型鏈實現繼承的三個弊端,就解決的。但是又出現了新的缺陷。

    缺陷

    1> 父類構造函數至少執行了兩次以上

    2> 子類構造函數的原型對象是父類的實例對象,那么個對象上的屬性將會是undefined

    JavaScript面向對象的示例分析

    以上是“JavaScript面向對象的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    兖州市| 电白县| 泗水县| 海盐县| 新郑市| 个旧市| 彰武县| 温州市| 股票| 潞西市| 什邡市| 治县。| 新安县| 霍林郭勒市| 芜湖县| 凉山| 中牟县| 普洱| 南京市| 色达县| 四平市| 安多县| 临沧市| 岳普湖县| 遂昌县| 枣庄市| 福海县| 卓资县| 长泰县| 镇平县| 富阳市| 连平县| 巴南区| 乐昌市| 浠水县| 邹平县| 南溪县| 永丰县| 专栏| 潮安县| 朔州市|