this指向的幾種狀況數組
1.全局中調用app
this.name //this指向window對象
2.函數調用函數
test();//test()函數中的this也指向window對象
3.對象的方法調用this
obj1.fn();//obj1對象的fn()方法中的this指向obj1
4.調用構造函數
var dog=new Dog();//構造函數內的this指向新建立的實例對象,也就是這裏的dogcall和applyspa
call和apply的做用同樣,只是接受參數的方式不同,call接受的是多個單個參數,apply接受的是參數數組。
call和apply的做用簡單地能夠說成,當一個對象實例缺乏一個函數/方法時,能夠調用其餘對象的現成函數/方法,其方式是經過替換其中的this爲這個對象實例,改變函數運行時的上下文。.net
普通函數與構造函數相比有四個明顯特色:prototype
1.不須要用new關鍵字調用code
fn();2.能夠用return語句返回值htm
1
2
3
4
|
function
fn(a,b){
return
a+b;
}
alert(fn(2,3));
//alert:5
|
3.函數內部不建議使用this關鍵字
咱們說不建議使用,固然硬要用是能夠的,只是要注意這時候發生了什麼。若是在普通函數內部使用this關鍵字定義變量或函數,由於這時候this指向的是window全局對象,這樣無心間就會爲window添加了一些全局變量或函數。對象
1
2
3
4
5
6
|
function
greeting(){
this
.name=
"sheila"
;
alert(
"hello "
+
this
.name);
}
greeting();
//alert:hello sheila
alert(window.name);
//alert:sheila
|
4.函數命名以駝峯方式,首字母小寫
構造函數
在JavaScript中,用new關鍵字來調用定義的構造函數。默認返回的是一個新對象,這個新對象具備構造函數定義的變量和函數/方法。
舉個例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function
Prince(name,age){
this
.gender=
"male"
;
this
.kind=
true
;
this
.rich=
true
;
this
.name=name;
this
.age=age;
}
Prince.prototype.toFrog=
function
(){
console.log(
"Prince "
+
this
.name+
" turned into a frog."
);
}
var
prince=
new
Prince(
"charming"
,25);
prince.toFrog();
//Prince charming turned into a frog.
prince.kind;
//true
|
與普通函數相比,構造函數有如下明顯特色:
1.用new關鍵字調用
var prince=new Prince("charming",25);
2.函數內部可使用this關鍵字
在構造函數內部,this指向的是構造出的新對象。用this定義的變量或函數/方法,就是實例變量或實例函數/方法。須要用實例才能訪問到,不能用類型名訪問。
prince.age;//25
Prince.age;//undefined
3.默認不用return返回值
構造函數是不須要用return顯式返回值的,默認會返回this,也就是新的實例對象。固然,也能夠用return語句,返回值會根據return值的類型而有所不一樣,細節將在下文介紹。
4.函數命名建議首字母大寫,與普通函數區分開。
不是命名規範中的,可是建議這麼寫。
1.第一步,建立一個空對象。
var prince={}
2.第二步,將構造函數Prince()中的this指向新建立的對象prince。 3.第三步,將prince的_proto_屬性指向Prince函數的prototype,建立對象和原型間關係 4.第四步,執行構造函數Prince()內的代碼。