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