摘要:在中,寫成類的本質(zhì)基本都是構(gòu)造函數(shù)原型。操作符左邊是待檢測(cè)類的對(duì)象,右邊是定義類的構(gòu)造函數(shù)。不宜用在這里,我們需要知道的幾種定義類的方法,除了上面的構(gòu)造函數(shù)外,還有方法用這個(gè)方法,類就是一個(gè)對(duì)象,而不是函數(shù)。
js類的基本含義
我們知道,在js中,是沒有類的概念的。類的所有實(shí)例對(duì)象都從同一個(gè)原型對(duì)象上繼承屬性,因此,原型對(duì)象是類的核心。
類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例。類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間?!俣劝倏?/p>
早期的javascript需求都很簡(jiǎn)單,基本都是寫成函數(shù)的,然后是面向過程的寫法,后來慢慢的引入面向?qū)ο箝_發(fā)思想,再后來就慢慢寫成 類。
在js中,寫成類的本質(zhì)基本都是 構(gòu)造函數(shù)+原型。下面,就討論一下js類的幾種寫法:
構(gòu)造函數(shù) 法/** * Person類:定義一個(gè)人,有name屬性和getName方法 */
由上面控制臺(tái)輸出結(jié)果可知,p1和p2的確是類Person的實(shí)例對(duì)象。instanceof操作符左邊是待檢測(cè)類的對(duì)象,右邊是定義類的構(gòu)造函數(shù)。這里,instanceof用來檢測(cè)對(duì)象p1是否屬于Person類。
這種方式的優(yōu)點(diǎn)是:我們可以根據(jù)參數(shù)來構(gòu)造不同的對(duì)象實(shí)例 ,缺點(diǎn)是每次構(gòu)造實(shí)例對(duì)象時(shí)都會(huì)生成getName方法,造成了內(nèi)存的浪費(fèi) 。
我們可以用一個(gè)外部函數(shù)來代替類方法,達(dá)到了每個(gè)對(duì)象共享同一個(gè)方法。改寫后的類如下:
//外部函數(shù)原型方式
原型方式的缺點(diǎn)就是不能通過參數(shù)來構(gòu)造對(duì)象實(shí)例 (一般每個(gè)對(duì)象的屬性是不相同的) ,優(yōu)點(diǎn)是所有對(duì)象實(shí)例都共享getName方法(相對(duì)于構(gòu)造函數(shù)方式),沒有造成內(nèi)存浪費(fèi) 。
構(gòu)造函數(shù)+原型方式取前面兩種的優(yōu)點(diǎn):
a、用構(gòu)造函數(shù)來定義類屬性(字段)。
b、用原型方式來定義類的方法。
這樣,我們就既可以構(gòu)造不同屬性的對(duì)象,也可以讓對(duì)象實(shí)例共享方法,不會(huì)造成內(nèi)存的浪費(fèi)。
為了讓js代碼風(fēng)格更緊湊,我們讓prototype方法代碼移到function Person的大括號(hào)內(nèi)。
在這里,我們需要知道的幾種定義類的方法,除了上面的構(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ì)象來模擬一個(gè)類,然后在類里面定義一個(gè)構(gòu)造函數(shù)createNew(),然后在createNew()里面定義實(shí)例對(duì)象,把這個(gè)實(shí)例對(duì)象作為返回值。
使用的時(shí)候,調(diào)用createNew()方法,就可以得到實(shí)例對(duì)象。
var p1 = Person.createNew(); p1.run();//I like running
這種寫法其實(shí)和對(duì)象字面量的寫法是很類似的,只不過一個(gè)是逗號(hào)分隔,一個(gè)是分號(hào)分隔。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/85332.html
摘要:記錄的學(xué)習(xí)筆記,在回答別人的問題時(shí)發(fā)現(xiàn)自己的的理解誤差很大的在沒有帶來的的時(shí)候,我們編寫的時(shí)候很多時(shí)候會(huì)通過構(gòu)造函數(shù)和原型鏈來添加方法屬性,實(shí)現(xiàn)的功能。而是看成是構(gòu)造函數(shù)的寫法。等同于類的實(shí)例對(duì)象就像使用構(gòu)造函數(shù)一樣使用命令來創(chuàng)建一個(gè)實(shí)例。 記錄class的學(xué)習(xí)筆記,在回答別人的問題時(shí)發(fā)現(xiàn)自己的的理解誤差很大 javascript的class 在沒有es6帶來的class的時(shí)候,我們編...
摘要:四混合方式對(duì)象冒充的主要問題是必須使用構(gòu)造函數(shù)方式,這不是最好的選擇。在中創(chuàng)建類的最好方式是用構(gòu)造函數(shù)定義屬性,用原型定義方法。注意,雖然代表了父類的構(gòu)造函數(shù),但是返回的是子類的實(shí)例,即內(nèi)部的指的是,因此在這里相當(dāng)于。 一、對(duì)象冒充 其原理如下:構(gòu)造函數(shù)使用 this 關(guān)鍵字給所有屬性和方法賦值(即采用類聲明的構(gòu)造函數(shù)方式)。因?yàn)闃?gòu)造函數(shù)只是一個(gè)函數(shù),所以可使 Parent 構(gòu)造函數(shù) ...
摘要:規(guī)定,每個(gè)函數(shù)都有一個(gè)屬性,指向一個(gè)對(duì)象大毛二毛構(gòu)造函數(shù)的屬性,就是實(shí)例對(duì)象和的原型對(duì)象。這就是所有對(duì)象都有和方法的原因,因?yàn)檫@是從繼承的構(gòu)造函數(shù)的屬性指向一個(gè)數(shù)組,就意味著實(shí)例對(duì)象可以調(diào)用數(shù)組方法。 目錄 [隱藏] 原型對(duì)象概述構(gòu)造函數(shù)的缺點(diǎn)prototype 屬性的作用原型鏈constructor 屬性instanceof 運(yùn)算符構(gòu)造函數(shù)的繼承多重繼承模塊基本的實(shí)現(xiàn)方法封裝私有變量...
摘要:新建一個(gè)類該函數(shù)返回一個(gè)類的實(shí)例給函數(shù)傳入通過立即調(diào)用類構(gòu)造函數(shù)可以創(chuàng)建單例。派生類是指繼承自其它類的新類。在構(gòu)造函數(shù)中訪問之前要調(diào)用,負(fù)責(zé)初始化。在構(gòu)造函數(shù)中使用通常表示當(dāng)前的構(gòu)造函數(shù)名。 ES5中的近類結(jié)構(gòu) ES5以及之前的版本,沒有類的概念,但是聰明的JavaScript開發(fā)者,為了實(shí)現(xiàn)面向?qū)ο?,?chuàng)建了特殊的近類結(jié)構(gòu)。 ES5中創(chuàng)建類的方法:新建一個(gè)構(gòu)造函數(shù),定義一個(gè)方法并且賦值...
閱讀 2622·2023-04-25 19:47
閱讀 3453·2019-08-29 17:18
閱讀 917·2019-08-29 15:26
閱讀 3417·2019-08-29 14:17
閱讀 1267·2019-08-26 13:49
閱讀 3405·2019-08-26 13:22
閱讀 3124·2019-08-26 10:44
閱讀 2758·2019-08-23 16:51