国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

JavaScript類的寫(xiě)法

2019-11-20 08:58:49
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

我們知道,在js中,是沒(méi)有類的概念的。類的所有實(shí)例對(duì)象都從同一個(gè)原型對(duì)象上繼承屬性,因此,原型對(duì)象是類的核心。

類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例。類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。―――百度百科

早期的javascript需求都很簡(jiǎn)單,基本都是寫(xiě)成函數(shù)的,然后是面向過(guò)程的寫(xiě)法,后來(lái)慢慢的引入面向?qū)ο箝_(kāi)發(fā)思想,再后來(lái)就慢慢寫(xiě)成類。

在js中,寫(xiě)成類的本質(zhì)基本都是 構(gòu)造函數(shù)+原型。下面,就討論一下js類的幾種寫(xiě)法:

構(gòu)造函數(shù)法

/*** Person類:定義一個(gè)人,有name屬性和getName方法  */<script>  function Person(name){    this.name = name;    this.getName = function(){      return this.name;    }  }  //我們?cè)谶@里實(shí)例化幾個(gè)對(duì)象    var p1 = new Person("trigkit4");  var p2 = new Person("mike");  console.log(p1 instanceof Person);//true  console.log(p2 instanceof Person);//true</script>

由上面控制臺(tái)輸出結(jié)果可知,p1和p2的確是類Person的實(shí)例對(duì)象。instanceof操作符左邊是待檢測(cè)類的對(duì)象,右邊是定義類的構(gòu)造函數(shù)。這里,instanceof用來(lái)檢測(cè)對(duì)象p1是否屬于Person類。

這種方式的優(yōu)點(diǎn)是:我們可以根據(jù)參數(shù)來(lái)構(gòu)造不同的對(duì)象實(shí)例 ,缺點(diǎn)是每次構(gòu)造實(shí)例對(duì)象時(shí)都會(huì)生成getName方法,造成了內(nèi)存的浪費(fèi) 。

我們可以用一個(gè)外部函數(shù)來(lái)代替類方法,達(dá)到了每個(gè)對(duì)象共享同一個(gè)方法。改寫(xiě)后的類如下:

//外部函數(shù)<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>

原型方式的缺點(diǎn)就是不能通過(guò)參數(shù)來(lái)構(gòu)造對(duì)象實(shí)例 (一般每個(gè)對(duì)象的屬性是不相同的) ,優(yōu)點(diǎn)是所有對(duì)象實(shí)例都共享getName方法(相對(duì)于構(gòu)造函數(shù)方式),沒(méi)有造成內(nèi)存浪費(fèi) 。

構(gòu)造函數(shù)+原型方式
取前面兩種的優(yōu)點(diǎn):
a、用構(gòu)造函數(shù)來(lái)定義類屬性(字段)。
b、用原型方式來(lái)定義類的方法。

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

這樣,我們就既可以構(gòu)造不同屬性的對(duì)象,也可以讓對(duì)象實(shí)例共享方法,不會(huì)造成內(nèi)存的浪費(fèi)。

為了讓js代碼風(fēng)格更緊湊,我們讓prototype方法代碼移到function Person的大括號(hào)內(nèi)。

<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>

在這里,我們需要知道的幾種定義類的方法,除了上面的構(gòu)造函數(shù)外,還有:

Object.create()方法
用這個(gè)方法,"類"就是一個(gè)對(duì)象,而不是函數(shù)。

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

然后,直接用Object.create()生成實(shí)例,不需要用到new。

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

這種方法比"構(gòu)造函數(shù)法"簡(jiǎn)單,但是不能實(shí)現(xiàn)私有屬性和私有方法,實(shí)例對(duì)象之間也不能共享數(shù)據(jù),對(duì)"類"的模擬不夠全面。

createNew()方法
這種方法不需要用到this和prototype,其做法是用對(duì)象來(lái)模擬一個(gè)類,然后在類里面定義一個(gè)構(gòu)造函數(shù)createNew(),然后在createNew()里面定義實(shí)例對(duì)象,把這個(gè)實(shí)例對(duì)象作為返回值。

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

使用的時(shí)候,調(diào)用createNew()方法,就可以得到實(shí)例對(duì)象。

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

這種寫(xiě)法其實(shí)和對(duì)象字面量的寫(xiě)法是很類似的,只不過(guò)一個(gè)是逗號(hào)分隔,一個(gè)是分號(hào)分隔。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西宁市| 宽城| 探索| 莱西市| 湘西| 开平市| 伊宁市| 娄底市| 米易县| 泊头市| 鹿邑县| 鹤山市| 资源县| 枣强县| 平原县| 乐至县| 柘城县| 兴安盟| 安顺市| 电白县| 姜堰市| 凤冈县| 北海市| 陵水| 资源县| 和平区| 孟津县| 安平县| 扬中市| 满洲里市| 乐陵市| 英山县| 孝昌县| 金寨县| 将乐县| 光泽县| 上林县| 云浮市| 会宁县| 随州市| 新建县|