物件是組成JavaScript的基本單元,在JS中,一切東東其實都是對象,而且功能非常強大,它不僅風格獨特,功能也與眾不同。
一、引用(reference)
所引用的概念是JS的基礎之一,它是指向物件實際位置的指標。請看下面的例子:
var items = new Array("abc","def","hig"); //创建此数组的引用 var Ref = items; items.push("klm"); alert(Ref.lenth); //此处应该显示4
但是,如果是字串,就會出現不同的情況,請參閱下面的程式碼:
var items = "abc"; var Ref = items; items += "def"; //这里创建了一个新对象,而非原对象的修改。
現在Ref與items指向的是不同的物件。
二、函數重載
JS的每個函數都有一個變數argument,它是接收所有參數的偽數組。為什麼是“偽”,因為你不能修改它,但它有length屬性。我們來看看下面的例子:
function myFun(num1,num2) { if(arguments.length == 2) { alert("我有两个参数"); } if(arguments.length == 1) { alert("我有一个参数"); } }
接下來,我們呼叫函數myFun("abc"); myFun("abc","def");看看有什麼不同,最重要的是,這本來就是函數重載嘛:)
三、作用域
在JavaScript裡,作用域是由函數劃分的,而不是由塊(while,if,for)劃分的。這樣在理解有些程式碼時,可能會帶來一些麻煩。為了對細節進行說明,我們看下面的例子:
var temp="oldTemp" //全局变量 if(true) { var temp = "newTemp" //这里还在全局中 } alert(temp == "newTemp") //发现相等
但是如果我們在一個函數中聲明並改變temp變量,效果則完全不同,見例子:
var temp="oldTemp" ; //全局变量 function test() { var temp = "newTemp"; } test(); alert(temp == "newTemp") ; //发现不相等
在JS中,全局變量是window對象的一個屬性,在上面的例子中,全域變數temp == window.temp,還有要注意的是:如果某一個變數缺乏聲明,就自動變成全域變量,雖然很可能它只在某個函數中使用。
四、閉包
閉包意味著內層的函數可以引用包圍它的函數內的變量,即使外層函數已經終止。請看下面的例子:
function AddNum(num1) { return function (num2) { return num1 + num2; } } var temp = AddNum(4); //传入第一个参数,然后AddNum消失 var temp2 = temp(5); //传入第二个参数,然后相加,返回9 alert(temp2);
這個例子很好體現了閉包的概念,是一種特殊情況,平常當然不這麼用。
五、上下文物件
上下文物件透過this變數來體現,這個變數永遠指向當前程式碼所處的物件中。請看下面的程式碼:
var obj ={ yes:function(){ this.val = true; }, no:function(){ this.val = false; } } alert(obj.val == null); //这里我们发现对象obj没有val属性 obj.yes(); //执行yes函数,obj有了val属性 alert(obj.val == true); window.no = obj.no //把obj的no函数传给window对象 window.no(); alert(obj.val == true) ; //发现没有变化 alert(window.val == false) //window里的val变为false;
這裡不太好理解,幸運的是,JS為我們提供了call方法。請參閱下面的範例:
function changeColor(color) { this.style.color = color; } changeColor("Red"); //这里不行,因为window对象没有style属性 var temp = document.getElementById("temp"); changeColor.call(temp,"White"); //这里注意call的用法
call方法將上下文物件設定為第一個參數,並將其他參數作為原始函數的參數。
六、物件
到這裡我們才進入正題,但有了前面的概念,這也塊內容其實也不是很多。我們直接看例子:
var obj = new Object(); //创建一个对象obj obj.val = 5; //创建属性obj,并为其赋值 obj.click = function() //创建函数 { alert("我被单击了"); }
上面的程式碼與下段程式碼等價:
var obj = { val : 5, click: function(){ alert("我被单击了"); } }
與其他物件導向語言不同的是,JS並沒有Class的概念,在其他語言中,我們基本上需要實例化某個具體類別的實例,但JS裡卻不同,它的做法是:任何函數都可以被實例化為一個物件。我們先建立一個簡單的物件:
function User(name) { this.name = name; } var temp = new User("张三"); alert(temp.name);
如果上面的物件User只當作函數使用呢?
User("只作为函数使用"); alert(window.name);
this的上下文變成了window物件。
七、物件的方法
公共方法在物件的上下文中是最終使用者可以接觸到的。這裡我們需要理解prototype(原型)屬性。請參閱下面的程式碼:
function User(name,age) { this.name = name; this.age = age; } User.prototype.getName = function(){ return this.name}; var user = new User("张三",25); alert(user.getName());
我們也可以動態創建公共方法,請參閱下面的程式碼:
function User(name,age) { this.name = name; this.age = age; this.getName = function(){ return this.name}; } var user = new User("张三",25); alert(user.getName());
動態產生的方法不是在程式碼第一次編譯時就已經生成,這個技巧被利用prototype開銷要大,但也更強大、更靈活。
以上就是JavaScript物件學習筆記 的內容,更多相關內容請關注PHP中文網(www.php.cn)!