Javascript構(gòu)造函數(shù)(一)概念,注意事項(xiàng),defineProperty

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

1.概念

在JavaScript中,任何合法的函數(shù)都可以作為對(duì)象的構(gòu)造函數(shù),既包含系統(tǒng)內(nèi)置函數(shù),也包括用戶自定義函數(shù),構(gòu)造函數(shù)就是用來創(chuàng)建對(duì)象時(shí)初始化對(duì)象,并且總與new運(yùn)算符一起使用,每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype屬性,指向另一個(gè)對(duì)象,這個(gè)對(duì)象的所有屬性和方法都會(huì)被構(gòu)造函數(shù)的實(shí)例繼承;

注意事項(xiàng):

1.在命名規(guī)則上,構(gòu)造函數(shù)一般是首字母大寫,普通函數(shù)則是遵照小駝峰式命名法。

2.通常來說,構(gòu)造函數(shù)沒有返回值,它們只會(huì)初始化由this指針傳遞進(jìn)來的對(duì)象,并且什么也不返回,new操作符會(huì)自動(dòng)創(chuàng)建給定的類型并返回它們,當(dāng)調(diào)用構(gòu)造函數(shù)時(shí),new會(huì)自動(dòng)創(chuàng)建this對(duì)象,且類型為構(gòu)造函數(shù)的類型,如果一個(gè)函數(shù)有返回值,被返回的對(duì)象就成new表達(dá)式的值。從形式上看,一個(gè)函數(shù)被作為構(gòu)造函數(shù)還是普通函數(shù)執(zhí)行的唯一區(qū)別,是否用new運(yùn)算符。


function test(){ 
    this.p = “I’m in constructed object”; 
    this.alertP = function(){ 
        alert(this.p); 
    } 
} 
var o2 = new  test();

那么通過new調(diào)用一個(gè)構(gòu)造函數(shù)的時(shí)候到底發(fā)生了生么呢?

var obj  ={};  
obj.__proto__ = CO.prototype;  
CO.call(obj);  
return obj;  

第一行,創(chuàng)建一個(gè)空對(duì)象obj。
第二行,將這個(gè)空對(duì)象的proto成員指向了構(gòu)造函數(shù)對(duì)象的prototype成員對(duì)象,這是最關(guān)鍵的一步,具體細(xì)節(jié)將在下文描述。
第三行,將構(gòu)造函數(shù)的作用域賦給新對(duì)象,因此CA函數(shù)中的this指向新對(duì)象obj,然后再調(diào)用CO函數(shù)。于是我們就給obj對(duì)象賦值了一個(gè)成員變量p,這個(gè)成員變量的值是” I’min constructed object”。
第四行,返回新對(duì)象obj。

3.構(gòu)造函數(shù)可以包含返回語(yǔ)句(不推薦),但返回值必須是this,或者其它非對(duì)象類型的值。將構(gòu)造函數(shù)返回值分為兩種情況:引用類型和值類型

如果一個(gè)函數(shù)的返回值是引用類型(數(shù)組,對(duì)象或者函數(shù))的數(shù)據(jù),那么這個(gè)函數(shù)作為構(gòu)造函數(shù)用new運(yùn)算符執(zhí)行構(gòu)造時(shí),運(yùn)算的結(jié)果將被它的返回值取代,這時(shí)候,構(gòu)造函數(shù)體內(nèi)的this值丟失了,取而代之的是被返回的對(duì)象。

構(gòu)造函數(shù)返回引用類型.png

結(jié)果.png

運(yùn)行結(jié)果m的值和n的值是一樣的,都是test函數(shù)返回的閉包,而this引用的對(duì)象和this.a=10的賦值結(jié)果全部被丟棄。

如果一個(gè)函數(shù)的返回值是一個(gè)值類型,那么這個(gè)函數(shù)作為構(gòu)造函數(shù)用new運(yùn)算符執(zhí)行構(gòu)造時(shí),它的返回值將被丟棄。new 表達(dá)式的結(jié)果仍然是this所引用的對(duì)象。

構(gòu)造函數(shù)返回值類型.png
結(jié)果 (2).png

4.可以在構(gòu)造函數(shù)中用object.defineProperty()方法實(shí)現(xiàn)初始化

Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性, 并返回這個(gè)對(duì)象。

語(yǔ)法

object.defineProperty(obj, prop, descriptor)

obj
要在其上定義屬性的對(duì)象。
prop
要定義或修改的屬性的名稱。
descriptor
將被定義或修改的屬性描述符。

返回值

被傳遞給參數(shù)的對(duì)象

ES6

在ES6中,由于 Symbol類型的特殊性,用Symbol類型的值來做對(duì)象的key與常規(guī)的定義或修改不同,而Object.defineProperty 是定義key為Symbol的屬性的方法之一。

描述

該方法允許精確添加或修改對(duì)象的屬性。通過賦值來添加的普通屬性會(huì)創(chuàng)建在屬性枚舉期間顯示的屬性(for...inObject.keys 方法), 這些值可以被改變,也可以被刪除。這種方法允許這些額外的細(xì)節(jié)從默認(rèn)值改變。默認(rèn)情況下,使用Object.defineProperty()添加的屬性值是不可變的。

屬性描述符

鍵值 configurable enumerable value writable get set
數(shù)據(jù)描述符 Yes Yes Yes Yes No No
存取描述符 Yes Yes No No Yes Yes

對(duì)象里目前存在的屬性描述符有兩種主要形式:數(shù)據(jù)描述符和存取描述符。數(shù)據(jù)描述符是一個(gè)具有值的屬性,該值可能是可寫的,也可能不是可寫的。存取描述符是由getter-setter函數(shù)對(duì)描述的屬性。描述符必須是這兩種形式之一;不能同時(shí)是兩者。

configurable

當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí),該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除。默認(rèn)為 false。

enumerable

當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中。默認(rèn)為 false。

value

該屬性對(duì)應(yīng)的值。可以是任何有效的 JavaScript 值(數(shù)值,對(duì)象,函數(shù)等)。默認(rèn)為 undefined。

writable

當(dāng)且僅當(dāng)該屬性的writabletrue時(shí),value才能被賦值運(yùn)算符改變。默認(rèn)為 false。

get

一個(gè)給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。該方法返回值被用作屬性值。默認(rèn)為 undefined。

set

一個(gè)給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。默認(rèn)為 undefined

defineProperty初始化構(gòu)造函數(shù).png

1.如果一個(gè)描述符不具有value,writable,get 和 set 任意一個(gè)關(guān)鍵字,那么它將被認(rèn)為是一個(gè)數(shù)據(jù)描述符。如果一個(gè)描述符同時(shí)有(value或writable)和(get或set)關(guān)鍵字,將會(huì)產(chǎn)生一個(gè)異常。
2.如果對(duì)象中不存在指定的屬性,Object.defineProperty()就創(chuàng)建這個(gè)屬性。當(dāng)描述符中省略某些字段時(shí),這些字段將使用它們的默認(rèn)值。擁有布爾值的字段的默認(rèn)值都是false。value,get和set字段的默認(rèn)值為undefined。一個(gè)沒有g(shù)et/set/value/writable定義的屬性被稱為“通用的”,并被“鍵入”為一個(gè)數(shù)據(jù)描述符。

如何實(shí)現(xiàn)一個(gè)自存檔對(duì)象。 當(dāng)設(shè)置temperature 屬性時(shí),archive 數(shù)組會(huì)獲取日志條目。
Archiver

5.在構(gòu)造函數(shù)中使用原型對(duì)象,也就是說構(gòu)造函數(shù)內(nèi)方法和原型對(duì)象的區(qū)別以及它們的優(yōu)缺點(diǎn),哈哈哈哈,下次再整理;啦啦啦啦?。?!

怎么才能賣個(gè)萌!??!

噢,不行!講個(gè)故事吧,
一天一個(gè)農(nóng)夫牽了一頭可愛的豬去市場(chǎng),走到中途,豬不見了,怎么找都找不到,那么請(qǐng)問這頭可愛的豬為什么找不到?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容