首頁 >web前端 >js教程 >JavaScript物件學習筆記

JavaScript物件學習筆記

黄舟
黄舟原創
2016-12-20 15:29:31844瀏覽

物件是組成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)! 


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn