剛剛接觸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。