對象是什么
對象是一個(gè)包含相關(guān)數(shù)據(jù)和方法的集合,通常由一些變量和函數(shù)組成,我們稱之為對象里面的屬性和方法。
面向?qū)ο蟮木幊炭梢岳斫鉃椋?strong>把一切看做成東西,這個(gè)東西有他自己的屬性和功能。
怎么創(chuàng)建對象
常見的創(chuàng)建方法有以下幾種。
1.Object構(gòu)造函數(shù)創(chuàng)建
var obj = new Object();
obj.member1Name = member1Value;
obj.member2Name = member2Value;
obj.member3Name = member3Value;
//用Object引用類型創(chuàng)建一個(gè)新實(shí)例,然后保存在obj中
2.對象字面量表示法
var obj= {
member1Name : member1Value,
member2Name : member2Value,
member3Name : member3Value
}
3.用構(gòu)造函數(shù)創(chuàng)建對象
function obj(arguments) {
this.member1Name = member1Value;
this.member2Name = member2Value;
this.member3Name = member3Value;
}
4.工廠模式創(chuàng)建
function myfun(arguments) {
var obj = new Object();
obj.member1Name = member1Value;
obj.member2Name = member2Value;
obj.member3Name = member3Value;
return obj;
}
var obj1 = myfun(arguments);
怎么訪問對象
-
點(diǎn)表示法
當(dāng)你想訪問對象里面的屬性的時(shí)候,將對象的名字后面加上一個(gè)點(diǎn),后面加上你要訪問的屬性名稱。如下所示:
obj.member1Name
obj.member1Name[1]
obj.member1Name()
-
括號(hào)表示法
另外一種是用括號(hào)將屬性括起來,按層級(jí)關(guān)系依次排列在對象的后面(注意要用引號(hào)包裹起來哦)。如下所示:
obj[“member1Name”]
obj[”member1Name”][”submember1Name”]
-
括號(hào)表示法的優(yōu)點(diǎn)
1.在程序運(yùn)行時(shí)創(chuàng)建和修改屬性。
obj = {};
for (var i = 0; i < 4; i++) {
obj["name"+i] = i;
}
console.log(obj); //=>
{name0: 0, name1: 1, name2: 2, name3: 3}
????2.可以通過變量來進(jìn)行訪問。
var propertyName = 'member1Name';
console.log(obj[member1Name]);
對象中的this
this可以理解為一個(gè)指針,它的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰。
實(shí)際上this的最終指向的是那個(gè)調(diào)用它的對象,更精確的說,this永遠(yuǎn)指向的是最后調(diào)用它的對象。
接下來我們從三種調(diào)用方式分別來闡述this在該情況下的指向。
1.作為對象來調(diào)用:this被綁定到該對象
var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
this.x = this.x + x;
this.y = this.y + y;
}
};
point.moveTo(1, 1)//this 綁定到當(dāng)前對象,即 point 對象
2.作為函數(shù)來調(diào)用:函數(shù)被直接調(diào)用綁定到全局對象
function makeNoSense(x) {
this.x = x;
}
makeNoSense(5); //=>這里等效為 window.makeNoSense(5);
x;// x 已經(jīng)成為一個(gè)值為 5 的全局變量
對于內(nèi)部函數(shù),即聲明在另外一個(gè)個(gè)函數(shù)體內(nèi)的函數(shù),也會(huì)綁定到全局。
var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
// 內(nèi)部函數(shù)
var moveX = function(x) {
this.x = x;//this綁定到了全局
};
// 內(nèi)部函數(shù)
var moveY = function(y) {
this.y = y;//this 綁定到了全局
console.log(this); //=>window
};
console.log(this);
moveX(x);
moveY(y);
}
};
point.moveTo(1, 1);
point.x; //==>0
point.y; //==>0
x; //==>1
y; //==>1
如果我們其實(shí)是想把point里面的x,y改變,可以這么做:
var point = {
x : 0,
y : 0,
moveTo : function(x, y) {
var that = this; //=>用變量把this保存起來
// 內(nèi)部函數(shù)
var moveX = function(x) {
that.x = x;
};
// 內(nèi)部函數(shù)
var moveY = function(y) {
that.y = y;
}
moveX(x);
moveY(y);
}
};
point.moveTo(1, 1);
point.x; //==>1
point.y; //==>1
3.作為構(gòu)造函數(shù)調(diào)用: 構(gòu)造函數(shù)中的this指向新創(chuàng)建的對象本身
function showName() {
this.name = "showName function";
}
var obj = new showName();
console.log(obj.name); //showName function
上述代碼中,我們通過new關(guān)鍵字創(chuàng)建一個(gè)對象的實(shí)例,new關(guān)鍵字可以改變this的指向,將這個(gè)this指向?qū)ο髈bj。