javascript的constructor簡單介紹:constructor可以返回對象對創建它的構造函數的引用,例如:var arr=[1,2,3];console.log(arr.constructor===Array);以上代碼中的輸出值是true,這說明數組對象arr的constructor...
javascript的constructor簡單介紹:
constructor可以返回對象對創建它的構造函數的引用,例如:
var arr=[1,2,3]; console.log(arr.constructor===Array);
以上代碼中的輸出值是true,這說明數組對象arr的constructor屬性指向它的構造函數Array。
可能上面的代碼過於簡單了,下麵再來一點稍稍複雜的代碼分析一下:
Object.prototype.webName="螞蟻部落"; function show(){ this.name="show函數name"; } show.prototype={ constructor:show, name:"show的原型對象的name", msg:function(){return this.name + this.webName} } var prototypeObj=show.prototype; console.log(prototypeObj.msg()); var obj=new prototypeObj.constructor; console.log(obj.name); var showObj=new show(); console.log(showObj.msg());
下麵對以上代碼進行一下註釋:
1.Object.prototype.webName="螞蟻部落"為Object的原型對象添加一個名為webName的屬性,屬性值為:螞蟻部落。
2.function show(){this.name="show函數name"},創建一個函數,當次函數用作構造函數的時候,this就只想通過構造函數創建的對象對象實例,那麼此對象實例的name屬性值為:show函數name。
3.show.prototype={},將show的原型對象設置為後面的對象直接量。
4.constructor:show,將原型對象的constructor屬性指向show函數。
5.name:"show的原型對象的name",屬性和屬性值,這個很簡單就不用數了。
6.msg:function(){return this.name + this.webName},和上面一個道理,只不過是函數而已。
7.var prototypeObj=show.prototype,將show函數的原型對象的引用賦值給變數prototypeObj。
8.console.log(prototypeObj.msg()),因為prototypeObj是show的原型對象的引用,那麼將會輸出:show的原型對象的name螞蟻部落,在msg,第一個this是指向原型的對象實例,第二個this也是,不過在原型對象中沒有webName屬性,那麼將會通過原型鏈找到Object的原型的webName屬性。
9.var obj=new prototypeObj.constructor,prototypeObj是指向show的原型對象的,也就是那個對象直接量,此對象直接量的constructor屬性是指向show函數的,所以這裡就是創建了一個show的對象實例。
10.console.log(obj.name),所以將會輸出show函數name。
11.var showObj=new show(),創建一個show的對象實例。
12.console.log(showObj.msg()),msg函數中的this是指向show的對象實例,儘管在原型對象中也有name屬性,但是對象本身的優先順序要高,第二個this自然也是指向show的對象實例,依然通過原型鏈找到:螞蟻部落,所以輸出結果為:show函數name螞蟻部落。
原文地址是:http://www.softwhy.com/forum.php?mod=viewthread&tid=9185
更多內容可以參閱:http://www.softwhy.com/javascript/