JavaScript 類、對象、this指針淺析


剛剛接觸JavaScript不久,一開始認爲它不過是個簡單的腳本語言而已,但是在平常或多或少的接觸中,對於this指針、全局和局部變量等理解的都不深刻,所以找了些資料看看。

一、類 和實例(對象)

1、類的創建

function class1(){
  //類成員的定義及構造函數
}
   這裏class1既是一個函數也是一個類。可以將它理解爲類的構造函數,負責初始化工作。

2、實例的創建

1)用 obj1=new class1();來獲得obj1對象

2)用{ }來創建無類型對象                 

  

var obj={};                         //定義了一個空對象 ,等價於var obj= new Object();
var user={
     name:"jack",
     favoriteColor:["red","green"],
     hello:function(){              //定義了hello方法
              alert("hello,"+this.name)   
     }
}

user.hello();                        //調用user對象的方法hello

3、函數對象

1)函數的使用方法

function func1(...){...};
var func2=function(...){...};
var func3=function func4(...){...};
var func5=new Function();
2)認識函數對象

 可以用function關鍵字定義一個函數,併爲每個函數指定一個函數名,通過函數名進行調用。在JavaScript解釋執行時,函數都是被維護爲一個對象,就是函數對象(Function Object)

下面兩段代碼都是創建一個函數myFunction:

function myFunction(a,b){
        return a+b;
}
//等價於
var myFunction =new Function("a","b","return a+b");

3)函數對象和其他內部對象的關係

內部對象:

alert(typeof(Array));     //function,表示一個類
alert(typeof(Object));   //function
alert(typeof(Date));     //function
alert(typeof(new Array()));    //object,返回一個對象
alert(typeof(new Object()));  //object
alert(typeof(new  Date()));   //object
函數:
alert(typeof(Function));         //function
alert(typeof(foo));              //function
alert(typeof(foo()));            //object
alert(typeof(new Function()));   //function
區別:new一個Function實際上返回的是一個函數,這與其他對象有很大的不同。儘管函數本身也是一個對象,但它與普通的對象還是很有區別的,因爲它同時也是一個對象構造器,也就是說,可以new一個函數來返回一個對象。所有typeof返回“function”的對象都是函數對象,也稱這樣的對象爲構造器(constructor)。因而,所有的構造器都是對象,但不是所有的對象都是構造器。Function是所有函數對象的基礎,而Object是所有對象(包括函數對象)的基礎。


4.深入認識this指針

JavaScript中的this指針式一個動態變化的變量,它表明了當前運行該函數的對象。一個對象就是由一個或多個屬性(方法)組合成的集合。每個集合元素不是僅能屬於一個集合,而是可以動態屬於多個集合。這樣,一個方法(集合元素)由誰調用,this指針就指向誰。

由於對象屬性(方法)的動態變化特性,一個對象的兩個屬性(方法)之間的相互引用,必須通過this指針

var namespace1=new Object();
namespace1.class1=function(){
    //初始化對象的代碼
}
var obj1=new namespace1.class1();
obj1.getP=function(){
     alert(this.p);   //表面上this指針指向的是object1
}
這裏的this關鍵字是不能省略的,即不能寫成alert(p)的形式,這將使得getP函數去引用上下文環境中的p變量,而不是obj1的屬性。


5、類的實現機制

// 構造函數
   function Person(name, sex) {
       this.name = name;
       this.sex = sex;
   }
   // 定義Person的原型,原型中的屬性可以被自定義對象引用
   Person.prototype = {
       getName: function() {
           return this.name;
       },
       getSex: function() {
           return this.sex;
       }
   }

當代碼var zhang = new Person("ZhangSan", "man")執行時,其實內部做了如下幾件事情:

  • 創建一個空白對象(new Object())。
  • 拷貝Person.prototype中的屬性(鍵值對)到這個空對象中(我們前面提到,內部實現時不是拷貝而是一個隱藏的鏈接)。
  • 將這個對象通過this關鍵字傳遞到構造函數中並執行構造函數。
  • 將這個對象賦值給變量zhang。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章