對象基礎瀏覽器
一、OOP函數
二、對象應用ui
三、對象的類型this
3.1 本地對象編碼
ECMA-262t將本地對象(native object)定義爲「獨立於宿主環境的ECMAScript實現提供的對象」。簡單的來講,本地對象是ECMA-262定義的類(引用類型)。spa
它們包括:prototype
Object Function Array String Boolean指針
Number Date RegExp Error EvalErrorcode
RangeError ReferenceError SyntaxError TypeError URIError對象
3.2 內置對象
ECMA-262把內置對象(built-in object)定義爲「由ECMAScript實現提供的、獨立於宿主環境的全部對象,在ECMAScript程序開始執行時出現」。
ECMA-262只定義了兩個內置對象:Global 和 Math 。內置對象也是本地對象。
在ECMAScript中,不存在獨立的函數,全部函數都必須是某個對象的方法。
encodeURI():不對URI中的特殊字符進行編碼,如冒號、前斜槓、問號和英鎊符號。
encodeURIComponent():對它發現的全部非標準字符進行編碼。 這兩個方法用於編碼傳遞給瀏覽器的URI。
decodeURI():
decodeURIComponent():
eval():最強大的方法,接受一個參數,即要執行的ECMAScript(或JavaScript)字符串。
3.3 宿主對象
Host Object: 由ECMAScript 實現的宿主環境提供的對象。全部BOM和DOM對象都是宿主對象。
四、做用域
變量的適用範圍。
4.1 公用、受保護和私有做用域
私有做用域的屬性只能在對象內部訪問,對於外部世界來講,這些屬性並不存在。這也意味着類定義了私有屬性和方法,它的子類也不能訪問這些屬性和方法。
4.2 靜態做用域並不是靜態的y
靜態做用域定義的屬性和方法任什麼時候候都能從同一個位置訪問。在Java中,類具備靜態屬性和方法,無需實例化該類的對象,就能夠訪問這些屬性和方法。
4.3 關鍵字this
this老是指向調用該方法的對象。
爲何使用this呢?由於在實例化對象時,老是不能肯定開發者會使用什麼樣的變量名。
使用this能夠在多個地方重用同一個函數。
funtion showColor(){
alert(this.color)
}
var oCar1 = new object;
oCar1.color = "red";
oCar1.showColor = showColor;
var oCar2 = new object;
oCar2.color = "blue";
oCar2.showColor = showColor;
oCar1.showColor(); //"red"
oCar2.showColor();//"blue"
調用oCar1.showColor()時,this指向oCar1;調用oCar2.showColor()時,this指向oCar2。
引用對象的屬性時,必須使用this關鍵字。若是不用對象或this引用變量,ECMAScript就會把它看成局部變量或全局變量。
而後該函數將查找名爲color的局部變量或全局變量。
五、定義類或對象
1,工廠方式
對象的屬性可在對象建立後動態定義,所以許多開發者在初次引入JavaScript時編寫相似下面的代碼:
var oCar = new Object();
oCar.color = "red";
oCar.showColor = function () {
alert(this.color);
};
首先,建立對象oCar。而後設置幾個屬性:顏色。第二個屬性是指向函數的指針,意味着該屬性是個方法。執行這段代碼就能夠使用對象oCar.
問題是可能須要建立多個car實例!!!!
要解決這個問題,開發者創造了能建立並返回特定類型的對象的工廠函數。
function createCar(sColor ) {
var oTempCar = new Object();
oTempCar.color = sColor;
oTempCar.showColor = function () {
console.log(this.color)
};
return oTempCar;
};
var oCar1 = createCar("red");
var oCar2 = createCar("blue");
問題是,在重複建立對象時,會存在重複建立函數oTempCar.showColor()對象的問題。
二、構造函數方式
構造函數看起來很像工廠函數,但構造函數的名字的首字母要大寫。構造函數內部無建立對象,而是使用this關鍵字,所以不須要return一個對象出來。
function Car(sColor) {
this.color = sColor;
this.showColor = function(){
alert(this.color);
};
};
問題是,構造函數也會重複生成函數,爲每一個對象都建立一個獨立的函數。
三、原型方式
利用對象的prototype屬性,可把當作建立對象新對象所依賴的原型。用空構造函數來設置類名,而後全部的屬性和方法都被直接賦予prototype屬性。
function Car() {
};
Car.prototype.color = "red";
Car.prototype.queue = new Array('Hello');
Car.prototype.showColor = function() {
console.log(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
首先定義構造函數(Car),經過給Car的prototype屬性添加屬性去定義Car 對象的屬性。調用new Car()時,原型的全部的屬性都被當即賦予要建立的對象。意味着全部Car實例存放的
都是指向showColor()函數的指針。
問題是,使用原型方式時,不能經過構造函數傳遞參數來初始化屬性的值。當屬性指向對象而不是函數時,會有值得注意的問題。
oCar1.queue.push("world!");
console.log(oCar1.queue); //output:【 hello,world!】
console.log(oCar2.queue);//output:【 hello,world!】
四、混合的構造函數/原型方式
function Car(sColor) {
this.color = sColor;
this.queue = new Array("Hello");
};
Car.prototype.showColor = function() {
console.log(this.color);
}
var oCar1 = new Car("red");
var oCar2 = new Car("blue");
oCar1.queue.push("world!");
console.log(oCar1.queue);//['hello','world!']
console.log(oCar2.queue);//['hello']
五、動態原型方法
六、修改對象