JavaScript類的寫法,JavaScript類寫法

來源:互聯網
上載者:User

JavaScript類的寫法,JavaScript類寫法

我們知道,在js中,是沒有類的概念的。類的所有執行個體對象都從同一個原型對象上繼承屬性,因此,原型對象是類的核心。

類是對象的抽象,而對象是類的具體執行個體。類是抽象的,不佔用記憶體,而對象是具體的,佔用儲存空間。———百度百科

早期的javascript需求都很簡單,基本都是寫成函數的,然後是面向過程的寫法,後來慢慢的引入物件導向開發思想,再後來就慢慢寫成類。

在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類。

這種方式的優點是:我們可以根據參數來構造不同的對象執行個體 ,缺點是每次構造執行個體對象時都會產生getName方法,造成了記憶體的浪費 。

我們可以用一個外部函數來代替類方法,達到了每個對象共用同一個方法。改寫後的類如下:

//外部函數<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、用原型方式來定義類的方法。

<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

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

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.