構造函數(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值丟失了,取而代之的是被返回的對象。


運行結果m的值和n的值是一樣的,都是test函數(shù)返回的閉包,而this引用的對象和this.a=10的賦值結果全部被丟棄。
如果一個函數(shù)的返回值是一個值類型,那么這個函數(shù)作為構造函數(shù)用new運算符執(zhí)行構造時,它的返回值將被丟棄。new 表達式的結果仍然是this所引用的對象。


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...in 或 Object.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
當且僅當該屬性的writable為true時,value才能被賦值運算符改變。默認為 false。
get
一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。該方法返回值被用作屬性值。默認為 undefined。
set
一個給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。該方法將接受唯一參數(shù),并將該參數(shù)的新值分配給該屬性。默認為 undefined。

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ù)組會獲取日志條目。

5.在構造函數(shù)中使用原型對象,也就是說構造函數(shù)內方法和原型對象的區(qū)別以及它們的優(yōu)缺點,哈哈哈哈,下次再整理;啦啦啦啦?。?!
怎么才能賣個萌?。。?/h4>
噢,不行!講個故事吧,
一天一個農夫牽了一頭可愛的豬去市場,走到中途,豬不見了,怎么找都找不到,那么請問這頭可愛的豬為什么找不到?