JavaScript原型

組織函數建立對象帶來的題目

上一篇文章引見了JavaScript建立對象的幾種要領,都有各自的優缺點。
組織函數看起來彷佛很好,然則它也有一個題目,那就是建立出來的每一個實例對象的要領都是一個自力的函數,縱然他們的內容是完全相同的,這是不符合函數的代碼復用準繩的,而且也不能夠一致的修正已被建立的實例的要領。

    function Person(name, age, sex) {
        this.name = name;
        this.age  = age;
        this.sex  = sex;
        
        this.introduce = function () {
            console.log("我叫" + this.name + ", 本年" + this.age + "歲.");
        };
    }
    
    var jerry = new Person("Jerry", "21", "M");
    var julia = new Person("Julia", "27", "F");

    console.log(jerry.introduce === julia.introduce);        // false

上述代碼中的jerry對象和julia對象的introduce()要領是兩個自力的函數,數據不同享,假如對象建立更多就浪費了大批的內存空間。

JavaScript原型處理方案

在 JavaScript 中,每當定義一個對象(函數也是對象)時刻,對象中都邑包括一些預定義的屬性。个中每一個函數對象都有一個 prototype 屬性,這個屬性指向函數的原型對象。

那末,這個原型對象有什麼作用呢?
組織函數是一個函數對象,所以就會有一個 prototype 屬性,也就有了一個原型對象,既然這是一個對象,那末久可認為它增加屬性和要領。而這個原型對象作為這個組織函數的一個屬性,是被其建立出來的一切實例同享的。

所以上面的代碼我們能夠如許改寫

    function Person(name, age, sex) {
        this.name = name;
        this.age  = age;
        this.sex  = sex;
    }

    Person.prototype.introduce = function () {
        console.log("我叫" + this.name + ", 本年" + this.age + "歲.");
    };

    var jerry = new Person("Jerry", "21", "M");
    var julia = new Person("Julia", "27", "F");

    console.log(jerry.introduce === julia.introduce);        // true

如許就處理了數據同享的題目,達到了代碼復用的目標,不管經由過程此組織函數建立了多少個對象,introduce 要領只會佔用一份內存空間。
且能夠一致修正一切 Person 組織函數建立的實例對象的 introduce 要領。

原型對象中的要領是能夠互相挪用的

    function Dog(name, age) {
        this.name = name;
        this.age = age;
    }

    Dog.prototype.play = function () {
        console.log("小狗遊玩");
        this.bark();
    };

    Dog.prototype.bark = function () {
        console.log("小狗叫");
    };

    var tom = new Dog("Tom", 3);
    
    tom.play();// 小狗遊玩    小狗叫
    原文作者:普通小豬
    原文地址: https://segmentfault.com/a/1190000014343770
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞