物件和建構函式
一.物件分類
1.內建物件:
- 由ES標準中定義的物件,在任意ES的實現中都可以使用
- 比如:Math String Number Boolean Function Object ...
2.宿主物件:
- 由JS的執行環境提供的物件,目前來講主要指瀏覽器提供的物件
- 比如:BOM DOM (consol.log() document.)
3.自定義物件:
- 由開發人員自建立的物件
二. 物件語法
法一:
建立物件: var obj=new Object();
新增物件: 物件.屬性名=值;
特殊:如果採用特殊屬性名(比如數字),需要使用另一種方式:
物件
且要怎麼新增,讀取就用什麼格式使用
修改屬性: 跟新增物件一樣
刪除屬性: delete 物件.屬性名;
法二:
Var obj={
屬性名:屬性值,
屬性名:屬性值,
...
屬性名:屬性值 (沒有逗號了!!!)
};
三:判斷屬性是否在物件裡面(in):
語法:“屬性名” in obj;
結果:如果在,返回true。 如果不在,返回false
物件深入
一:工廠生產物件(用的不多):
作用:就是生產物件快點,沒有新的知識,就只是單純函式和物件的結合使用
思想:函式+物件
步驟:建立一個傳參(傳物件的值些)函式
在函式中new一個物件,如果讓物件中的值等於引數的值
函式返回這個物件
function creatPerson(name,age,sex){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.sex=sex;
return obj;
}
This
來歷:解析器在呼叫函式每次都會向函式內部傳遞一個隱形的引數,
這個隱形的引數就是this,this指向一個對像
這個物件我們稱為函式執行的上下文物件
代表什麼:根據函式的呼叫方式的不同,this會指向不同的物件(有4種)
- 以函式的形式呼叫時,this永遠都是window
(因為使用函式,其實也是呼叫window的方法,this當然指向window,比如
函式 fn,使用函式 fn()就等於 window.fn())
- 以方法的形式呼叫時,this就是呼叫方法的那個物件
(其實第二種包括了第一種)
call和apply
- 這倆個方法都是函式物件的方法,需要通過函式物件來呼叫
比如:function Fn(a,b){}
Fn.call(函式中this要指向的物件,函式引數1,引數2...)
Fn.apply(函式中this要指向的物件,函式引數以陣列形式傳【引數1,引數2】)
Agrument
-在呼叫函式時,瀏覽器1每次都會傳遞倆個隱含的引數
-1.執行的上下文物件 this
-2封裝實參的物件 arguments
解釋:
1.arguments是一個類陣列物件,他也可以通過索引來操作資料,也可以獲取長度
2.在呼叫函式時,我們所傳遞的實參都會在arguments中儲存
3.arguments。Length可以用來獲取實參的長度
4.即使不定義形參,也可以通過arguments來使用形參
只不過比較麻煩
-arguments[0] 第一個實參
5.裡邊有一個屬性叫做call
這個屬性對應一個函式物件,就是當前正在指向的函式物件
二:建構函式(函式首字母必須大寫,這是對自己的規範!):
1. 什麼是建構函式:
- 建構函式和普通函式沒有區別,而區別就是呼叫方式的不同
- 普通函式是直接呼叫,而建構函式需要使用new關鍵字來呼叫
- new物件,是從堆裡面給出空間,賦值給變數的只是堆裡面的地址,類似於指標
2.建構函式的執行流程:
1.立刻建立一個新的物件
2.將新建的物件設定為函式中的this,在建構函式中可以使用this來引用新建的物件(建立的這個新物件,也就是this)
3.逐行執行函式中的程式碼(比如alert(1)會立即執行)
4.將新建的物件作為返回值返回
3.使用instanceof可以檢查一個物件是否是一個類的例項
語法:
物件 instanceof 建構函式
兒子 父親(或者跟高階的祖先,比如 Object)
先有建構函式,就是一個類,然後才能例項化物件
比如: var per=new Person("孫悟空",18,"男");
console.log(per instanceof Person);
如果是,則返回true,否則返回false
4.建構函式建立例項:
function Person(name, age , gender){
this.name=name; //this是不能少,因為沒有this,就不能給物件新增屬性,因為只有this才能指向當前建立的物件
this.age=age;
this.gender=gender;
this.sayName=function(){ //這裡為了
alert(this.name);
}
}
var per=new Person("孫悟空",18,"男");
原型
1.來源:我們所建立的每一個函式,解析器都會向函式中新增一個屬性prototype(每個函式的原型都不一樣,但是一個建構函式,無論new多少個,它的原型都一樣,共享),這個屬性對應著一個物件,徵物件就是我們所謂的原型物件
2.如果函式作為普通函式呼叫prototype沒有任何作用,且每一個原型都不一樣
3.當函式通過建構函式呼叫時,它所建立的物件中都會有一個隱藏的屬性——也指向該建構函式的原型物件,我們可以通過__proto__來訪問該屬性(物件)。
4.每個建構函式的原型物件都一樣(類似於公共區域)
例如:建構函式原型: function fn(){};
var Fn=new fn();
Fn.__proto__ :這就是原型物件,是個物件哦,可以新增方法值哦
- 原型物件就相當於一個公共區域,所有同一個類都可以訪問這個原型物件,
我們可以將物件中共有的內容,統一設定到原型物件中。
注:當我們訪問物件中的一個屬性或者方法時,它會先在物件自身中尋找,如果有則直接使用,如果沒有,則會到原型物件中尋找,如果找到就直接使用。
- 所以共有屬性,可以新增到原型物件中,因為可以不會影響到全域性作用域
- 原型也有原型