1.一般寫法規範
建構函式都應該以 乙個大寫字母開頭,eg:
function person()
而非建構函式則應該以乙個小寫字母開頭,eg:
function person()
2.呼叫方式
任何函式,只要通過 new 操作符來呼叫,那它就可以作為建構函式 ;
任何函式,如果不通過 new 操作符來呼叫,那它跟普通函式也沒有什麼兩樣。
//建立函式
function
person
(name,age,job)
}//當做建構函式使用
var person =
newperson
('nicholas',29
,'software engineer');
//過程:在new關鍵字宣告後,則會建立了乙個物件,並且person內部的this指向著這個物件,同時繼續執行person函式內部**,全部執行完後,則返回this所指向的物件
person.
sayname()
;//'nicholas'
//當做普通函式呼叫
person
('greg',27
,'doctor');
//返回值為undefined
//過程:因為函式外部沒有物件呼叫,所以函式內部this指向全域性物件window,繼續執行person函式
//又因為有this.name = name;等**,所以相當於執行了window.name = name
window.
sayname()
;//'greg'
函式如果有返回值的情況則分為引用型別和值型別兩種情況:
//函式顯式寫了返回值為引用型別時,
//1.當使用new之後,函式(包括建構函式)返回值為該引用型別
//2.當普通函式呼叫時,返回顯式的return值
function
test()
}var m=
newtest()
;// 內部this指向以test為建構函式的物件,但後面沒有返回引用,所以會被丟棄
var n=
test()
;// 內部this指向window全域性物件,其中 window.a = 10
console.
log(m)
;//返回return後面的閉包
console.
log(n)
;//返回return 後面的閉包
執行結果m的值和n的值是一樣的,都是test函式返回的閉包,而this引用的物件和this.a=10的賦值結果全部被丟棄。
如果乙個函式的返回值是乙個值型別,那麼這個函式作為建構函式用new運算子執行構造時,它的返回值將被丟棄。new 表示式的結果仍然是this所引用的物件。
//當函式顯式寫了返回值為原始資料型別時,
//1.當使用new之後,函式(包括建構函式)返回原this物件,該物件的constructor(該屬性繼承自該函式的原型物件)指向著該函式。
//2.在普通函式呼叫下,返回顯式的return值
function
test()
var m=
newtest()
;//m為物件,m.constructor --> function test()
//m的constructor屬性繼承自test.propertype原型物件(每個函式都有著原型物件)
//m.__proto__ === test.propertype
var n=
test()
;//n為1,其中 window.a = 10
console.
log(m)
//返回[object]
console.
log(n)
//返回1.
RyuJIT的華麗轉身
ryujit是作為.net即時編譯器的代號稱謂,它是.net執行時的基本元件之一。與此相反的是,roslyn作為c 編譯器,其編譯c 成為il位元組碼。然後,其再將il位元組碼編譯成相對於多種處理器的機器碼。隨著最近對dotnet coreclr 18064的合併,將生成元件的遺留 來自較老的jit...
js建構函式
1 經典例項,涵蓋全域性變數,區域性變數,變數宣告提公升,物件,上下文,閉包等知識 var num 4 var obj this.num 2 num 3 alert num var fn obj.fn window.num 8 num nan num 4 fn function alert num ...
JS建構函式
建立乙個物件可以字面量建立或建構函式建立 字面量建立物件例如 字面量建立物件 var p1 但如果需要建立多個同一型別 屬性和方法都相同 的物件,使用字面量不合適,可以使用建構函式建立 宣告建構函式的語法和普通函式相同,但是建構函式的函式名首字母大寫 function student name,st...