Js中的對象
(一)原型:
在JavaScript中,對象是沒有原型的,只有構造函數擁有原型,而構造類的實例對象都能經過prototype屬性訪問原型對象。
在JavaScript中,對象應該是類(class)和實例(instance)的關係演化。類是對象的模型化,而實例則是類的特徵具體化,類包含不少概念類型,如元類,超類,泛類和類型等。
例如:
function Class(type){
this.type = type;
}
var instance1 = new Class("instance1");
var instance2 = new Class("instance2");
使用instanceof運算符能夠驗證它們之間的關係:
alert(instance1 instanceof Class); //true
alert(instance2 instanceof Class); //true
instance1 和instance2都是對象,可是Class構造函數不是它們惟一的類型,Object也是它們的類型
alert(instance1 instanceof Object); //true
alert(instance2 instanceof Object); //true
Object 比 Class類型更加抽象,它們之間屬於一種繼承關係。
alert(Class instanceof Object); //true
可是instance1和instance2對象不是Function構造函數的實例,這說明它們之間沒有直接關係
alert(instance1 instanceof Function); //false
alert(instance2 instanceof Function); //false
而Object和Function之間的關係很是微妙,它們都是高度抽象的類型,互相爲對方的實例
alert(Object instanceof Function);//true,說明Object對象是Function函數的實例
alert(Function instanceof Function);//true,說明Function函數是Object對象的實例
Obj與Function同時也是兩個不一樣類型的構造器,下面的代碼能夠很好展現它們之間的差別
var f = new Function();
var o = new Object();
alert(f instanceof Function); //true
alert(f instanceof Object); //true
alert(o instanceof Function); //false
alert(o instanceof Object); //true
(二)對象中的this
this是一個動態指針。this所指向的對象是由this所在的執行域決定的,而不是由this所在的定義域決定的,this是JavaScript執行域中的一個屬性,它的指針始終指向當前調用的對象。
this的指向有下列幾種狀況:
(1)指向當前的DOM對象
下面這個按鈕定義了一個單擊屬性,其中包含了this關鍵字
<input type="button" value="點擊" onclick = "this.value='我被點擊'"/>
其中,onclick時間屬性中包含的this就表明當前DOM對象input
(2)指向構造函數,在其中使用this關鍵字做爲臨時表明,而後使用new運算符實例化構造函數
function F(){
this.name = "hello world";
}
var f = new F();
alert(f.name);
這裏的this就表明房錢實例對象f
(3)指向當前對象直接量
下面是一個對象直接量,它包含了兩個屬性,其中方法me()返回關鍵字this
var o = {
name : "我是對象o",
me : function(){
return this;
}
var who = o.me();
alert(who.name);
在調用對象直接量o的方法me()後,變量who的值就是this的值,它表明當前對象直接量o,而後讀取對象o的屬性name,返回字符串「我是對象o"
(4)指向全局對象
在函數f()中調用this關鍵字,而且爲this定義並初始化一個屬性name,在調用函數以後,能夠直接讀取屬性name
function f(){
this.name = "我是誰?";
}
f();
alert(name);
在函數f()中,this實際上就是表明window,實際上,上面代碼能夠寫成以下形式,
window.f = function(){
this.name = "我是誰?";
}
window.f();
alert(window.name);
(5)指向當前做用域對象
}
函數