JavaScript類的寫法

js類的基本含義

咱們知道,在js中,是沒有類的概念的。類的全部實例對象都從同一個原型對象上繼承屬性,所以,原型對象是類的核心。javascript

類是對象的抽象,而對象是類的具體實例。類是抽象的,不佔用內存,而對象是具體的,佔用存儲空間。———百度百科java

早期的javascript需求都很簡單,基本都是寫成函數的,而後是面向過程的寫法,後來慢慢的引入面向對象開發思想,再後來就慢慢寫成 segmentfault

js中,寫成類的本質基本都是 構造函數+原型。下面,就討論一下js類的幾種寫法:函數

構造函數 法

/**
* Person類:定義一我的,有name屬性和getName方法
   */
<script>
    function Person(name){
        this.name = name;
        this.getName = function(){
            return this.name;
        }
    }

    //咱們在這裏實例化幾個對象
   
    var p1 = new Person("trigkit4");
    var p2 = new Person("mike");

    console.log(p1 instanceof Person);//true
    console.log(p2 instanceof Person);//true
</script>

由上面控制檯輸出結果可知,p1和p2的確是類Person的實例對象。instanceof操做符左邊是待檢測類的對象,右邊是定義類的構造函數。這裏,instanceof用來檢測對象p1是否屬於Person類。this

這種方式的優勢是:咱們能夠根據參數來構造不一樣的對象實例 ,缺點是每次構造實例對象時都會生成getName方法,形成了內存的浪費 。prototype

咱們能夠用一個外部函數來代替類方法,達到了每一個對象共享同一個方法。改寫後的類以下:code

//外部函數
<script>
    function getName() {
        return this.name;
    }

    function Person(name){
        this.name = name;
        this.getName = getName;//
    }
</script>

原型方式

<script>
    function Person(){};
    Person.prototype.name = "trigkit4";//類的屬性都放在prototype上
    Person.prototype.getName = function(){
        return " I'm " + this.name;
    }

    var p1 = new Person();
    var p2 = new Person();
    console.log(p1.name);//trigkit4
    console.log(p2.getName());//I'm trigkit4
</script>

原型方式的缺點就是不能經過參數來構造對象實例 (通常每一個對象的屬性是不相同的) ,優勢是全部對象實例都共享getName方法(相對於構造函數方式),沒有形成內存浪費 。對象

構造函數+原型方式

取前面兩種的優勢:
a、用構造函數來定義類屬性(字段)。
b、用原型方式來定義類的方法。blog

<script>
    function Person(name){
        this.name = name;
    }

    //原型的特性可讓對象實例共享getName方法
    Person.prototype.getName = function(){
        return " I'm " + this.name;
    }
</script>

這樣,咱們就既能夠構造不一樣屬性的對象,也可讓對象實例共享方法,不會形成內存的浪費。繼承

爲了讓js代碼風格更緊湊,咱們讓prototype方法代碼移到function Person的大括號內。

<script>
    function Person(name){
        this.name = name;
        Person.prototype.getName = function(){
            return name;//不宜用this.name
        }
    }

    var p1 = new Person('trigkit4');
    console.log(p1.getName());//trigkit4
</script>

在這裏,咱們須要知道的幾種定義類的方法,除了上面的構造函數外,還有:

Object.create()方法

用這個方法,"類"就是一個對象,而不是函數。

var Person = {
        name : "trigkit4",
        age : 21,
        run:  function(){
            alert("I like running");
        }
    }

而後,直接用Object.create()生成實例,不須要用到new。

var p1 = Object.create(Person);
    alert(p1.age);//21
    p1.run();//I like running

這種方法比"構造函數法"簡單,可是不能實現私有屬性和私有方法,實例對象之間也不能共享數據,對"類"的模擬不夠全面。

createNew()方法

這種方法不須要用到this和prototype,其作法是用對象來模擬一個類,而後在類裏面定義一個構造函數createNew(),而後在createNew()裏面定義實例對象,把這個實例對象做爲返回值。

<script>
    var Person = {

        createNew : function () {
            var person = {};
            person.name = "trigkit4";
            person.run = function(){
                alert("I like running");
            };
            return person;
        }

    }
</script>

使用的時候,調用createNew()方法,就能夠獲得實例對象。

var p1 = Person.createNew();
    p1.run();//I like running

這種寫法其實和對象字面量的寫法是很相似的,只不過一個是逗號分隔,一個是分號分隔。

相關文章
相關標籤/搜索