Javascript構造函數(shù)(一)概念,注意事項,defineProperty

構造函數(shù)

1.概念

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

注意事項:

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

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


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

那么通過new調用一個構造函數(shù)的時候到底發(fā)生了生么呢?

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

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

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

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

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

結果.png

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

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

構造函數(shù)返回值類型.png
結果 (2).png

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

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

語法

object.defineProperty(obj, prop, descriptor)

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

返回值

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

ES6

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

描述

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

屬性描述符

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

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

configurable

當且僅當該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。默認為 false。

enumerable

當且僅當該屬性的enumerable為true時,該屬性才能夠出現(xiàn)在對象的枚舉屬性中。默認為 false。

value

該屬性對應的值??梢允侨魏斡行У?JavaScript 值(數(shù)值,對象,函數(shù)等)。默認為 undefined。

writable

當且僅當該屬性的writabletrue時,value才能被賦值運算符改變。默認為 false

get

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

set

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

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

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

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

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

怎么才能賣個萌?。。?/h4>

噢,不行!講個故事吧,
一天一個農夫牽了一頭可愛的豬去市場,走到中途,豬不見了,怎么找都找不到,那么請問這頭可愛的豬為什么找不到?

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容