亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

js constructor的實際作用分析

 更新時間:2011年11月15日 01:37:47   作者:  
大家討論下constructor的作用哈,需要的朋友可以參考下。從51js摘編而來。
復制代碼 代碼如下:

<script> Function.prototype.createInstance = function(){
var T = function(){};
T.prototype = this.prototype;
T.constructor = this;
var o = new T();
this.apply(o, arguments);
return o;
}</script>

說下上面代碼里面 T.constructor = this這句話,我感覺這句話沒有什么實際作用,
本身T.constructor應該是為Funtion,為什么要給它設定為Funtion的實例呢,
復制代碼 代碼如下:

<script>
Function.prototype.$extends = function(p){
this.$super = p;
var fn = function(){};
fn.prototype = p.prototype;
this.prototype = new fn();
//這句是我自己加的,保證構(gòu)造出子類實例的constructor依然指向子類的構(gòu)造器函數(shù)
this.prototype.constructor=this;
//-----------------------------
return this;
};
function Animal(){
}
function Cat(){
}
Cat.$extends(Animal);
var bb=new Cat();
alert(bb.constructor);
//但是(this.prototype.constructor=this)這種做法通過bb這個對象無法回朔到Animal的原型
//下面語句依然返回Cat這個函數(shù),而不是Animal
alert(bb.constructor.prototype.constructor)
</script>

還有上面這句代碼,我自己加了1句,修正了子類構(gòu)造器依然指向子類函數(shù),但是對象的原型鏈的回朔不能到達父類原型,解決辦法是
去掉this.prototype.constructor=this;既不給原型設置constructor屬性,而是給實例設置一個constructor屬性,如下代碼
復制代碼 代碼如下:

<script>
Function.prototype.$extends = function(p){
this.$super = p;
var fn = function(){};
fn.prototype = p.prototype;
this.prototype = new fn();
return this;
};
function Animal(){
}
function Cat(){
this.constructor= arguments.callee;
}
Cat.$extends(Animal);
var bb=new Cat();
alert(bb.constructor);
//這種做法可以通過bb這個對象回朔到Animal的原型
alert(bb.constructor.prototype.constructor)
</script>

最后分析下constructor的實際作用
復制代碼 代碼如下:

<script>
//定義函數(shù)
var f=function(){
}
//這里顯示true,因為f的構(gòu)造器是Funtion,f內(nèi)部的原型屬性_proto_被賦值為構(gòu)造器的prototype也就是Function的prototype
//instanceof檢查f內(nèi)部的_proto_是否與Function.prototype有共同的結(jié)點,如果有則返回true
alert(f instanceof Function)
//obj是f的實例
var obj=new f;
//obj內(nèi)部的原型屬性_proto_在new f時被賦值為f.prototype,顯然f.prototype與Function.prototype沒有共同的結(jié)點,因此顯示false
alert(obj instanceof Function)
//為了讓obj成為Function的實例也就是(obj instanceof Function)顯示true
//只需要f.prototype=Function.prototype
f.prototype=Function.prototype;
//但是我不推薦上面這種做法,因為對f.prototype的修改會破壞了Function.prototype,例如f.prototype.name="51js"會給Function的原型也加上1個name屬性
//正確的做法應該是下面這樣,這樣諸如f.prototype.name的修改就不會破壞Function的原型了
f.prototype=new Function();
f.prototype.name="zhouyang";
/**關鍵是這里,再次調(diào)整constructor屬性為f,維護constructor這種做法是為了保證obj能夠正確回朔原型鏈,
*假如我們要獲取obj內(nèi)部的原型鏈,但只知道obj,不知道obj是怎么實例化來的,由于obj內(nèi)部的_proto_屬性不可見,那么我們要獲取obj內(nèi)部原形只能通過obj.constructor來獲取構(gòu)造器,然后再獲取構(gòu)造器的prototype
*1.如果我們加下面這句(f.prototype.constructor=f),回朔obj原型鏈
*只能回朔1層原型鏈也就是obj.constructor.prototype(子類原型)-->obj.constructor.prototype.constructor.prototype(依然是子類原型),這樣只能回朔1層原型鏈
**/
f.prototype.constructor=f;
obj=new f;
alert("找到子類了---"+obj.constructor+"\n"
+"找到的還是子類,無法找到父類---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
/**2.如果我們用下面的方法在f定義里設置f的實例的constructor,而不是f原型的constructor
*就可以回朔2層原型鏈也就是 obj.constructor.prototype(子類原型)-->obj.constructor.prototype.constructor.prototype(父類原型)
*顯然這種情況是符合對象原型繼承鏈的情況的
*/
f=function(){
this.constructor=arguments.callee;
}
f.prototype=new Function();
f.prototype.name="zhouyang";
obj=new f;
alert("找到子類了---"+obj.constructor+"\n"
+"找到父類了---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
</script>

復制代碼 代碼如下:

<script>
//定義函數(shù)
var f=function(){
}
//這里顯示true,因為f的構(gòu)造器是Funtion,f內(nèi)部的原型屬性_proto_被賦值為構(gòu)造器的prototype也就是Function的prototype
//instanceof檢查f內(nèi)部的_proto_是否與Function.prototype有共同的結(jié)點,如果有則返回true
alert(f instanceof Function)
//obj是f的實例
var obj=new f;
//obj內(nèi)部的原型屬性_proto_在new f時被賦值為f.prototype,顯然f.prototype與Function.prototype沒有共同的結(jié)點,因此顯示false
alert(obj instanceof Function)
//為了讓obj成為Function的實例也就是(obj instanceof Function)顯示true
//只需要f.prototype=Function.prototype
f.prototype=Function.prototype;
//但是我不推薦上面這種做法,因為對f.prototype的修改會破壞了Function.prototype,例如f.prototype.name="51js"會給Function的原型也加上1個name屬性
//正確的做法應該是下面這樣,這樣諸如f.prototype.name的修改就不會破壞Function的原型了
f.prototype=new Function();
f.prototype.name="zhouyang";
/**關鍵是這里,再次調(diào)整constructor屬性為f,維護constructor這種做法是為了保證obj能夠正確回朔原型鏈,
*假如我們要獲取obj內(nèi)部的原型鏈,但只知道obj,不知道obj是怎么實例化來的,由于obj內(nèi)部的_proto_屬性不可見,那么我們要獲取obj內(nèi)部原形只能通過obj.constructor來獲取構(gòu)造器,然后再獲取構(gòu)造器的prototype
*1.如果我們加下面這句(f.prototype.constructor=f),回朔obj原型鏈
*只能回朔1層原型鏈也就是obj.constructor.prototype(子類原型)-->obj.constructor.prototype.constructor.prototype(依然是子類原型),這樣只能回朔1層原型鏈
**/
f.prototype.constructor=f;
obj=new f;
alert("找到子類了---"+obj.constructor+"\n"
+"找到的還是子類,無法找到父類---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
/**2.如果我們用下面的方法在f定義里設置f的實例的constructor,而不是f原型的constructor
*就可以回朔2層原型鏈也就是 obj.constructor.prototype(子類原型)-->obj.constructor.prototype.constructor.prototype(父類原型)
*顯然這種情況是符合對象原型繼承鏈的情況的
*/
f=function(){
this.constructor=arguments.callee;
}
f.prototype=new Function();
f.prototype.name="zhouyang";
obj=new f;
alert("找到子類了---"+obj.constructor+"\n"
+"找到父類了---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
</script>結(jié)論constructor的作用就是維護對象的原型鏈

向果果和winter賜教一下,不知理解的是否正確哈,另外我看大家常說的原型的污染到底指的是什么??
作用的話下面這個或許可以說明
復制代碼 代碼如下:

<script>
var f = function(x){}
f.prototype={};
alert((new f).constructor);
f.prototype.constructor=f;
alert((new f).constructor);
</script>

相關文章

  • 純JS代碼實現(xiàn)隔行變色鼠標移入高亮

    純JS代碼實現(xiàn)隔行變色鼠標移入高亮

    這篇文章主要介紹了純JS代碼實現(xiàn)隔行變色鼠標移入高亮的相關資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2016-11-11
  • 詳解js訪問對象的屬性和方法

    詳解js訪問對象的屬性和方法

    在本篇文章里我們給大家分享了關于js訪問對象的屬性和方法的相關知識點,有需要的朋友們可以學習下。
    2018-10-10
  • 淺談JavaScript中指針和地址

    淺談JavaScript中指針和地址

    Javascript是一門基于對象的動態(tài)語言,也就是說,所有東西都是對象,一個很典型的例子就是函數(shù)也被視為普通的對象。Javascript可以通過一定的設計模式來實現(xiàn)面向?qū)ο蟮木幊?,其中this指針就是實現(xiàn)面向?qū)ο蟮囊粋€很重要的特性。
    2015-07-07
  • 微信小程序?qū)崿F(xiàn)藍牙打印

    微信小程序?qū)崿F(xiàn)藍牙打印

    這篇文章主要為大家詳細介紹了微信小程序?qū)崿F(xiàn)藍牙打印,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • 全解跨域請求問題處理方法及分析

    全解跨域請求問題處理方法及分析

    這篇文章主要為大家介紹了全解跨域請求問題處理方法及分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>
    2023-07-07
  • javascript寫的簡單的計算器,內(nèi)容很多,方法實用,推薦

    javascript寫的簡單的計算器,內(nèi)容很多,方法實用,推薦

    最近用javascript寫了一個簡單的計算器,自己測試感覺還好,代碼都給了注釋,非常不錯,推薦大家學習。
    2011-12-12
  • 基于Fixed定位的框選功能的實現(xiàn)代碼

    基于Fixed定位的框選功能的實現(xiàn)代碼

    這篇文章主要介紹了基于Fixed定位的框選功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • element-ui的表單驗證清除校驗提示語的解決方案

    element-ui的表單驗證清除校驗提示語的解決方案

    對表單域中的數(shù)據(jù)進行校驗的時候,其中有一項比較特殊,不是簡單的輸入框,下拉框這些表單元素,而是自己寫的一個el-table的選擇彈窗,本文給大家介紹element-ui的表單驗證如何清除校驗提示語,感興趣的朋友一起看看吧
    2024-01-01
  • js改變style樣式和css樣式的簡單實例

    js改變style樣式和css樣式的簡單實例

    下面小編就為大家?guī)硪黄猨s改變style樣式和css樣式的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 用js寫了一個類似php的print_r輸出換行功能

    用js寫了一個類似php的print_r輸出換行功能

    因為php的print_r比較好用同時js卻沒有這個功能于是自己就寫了一個,感興趣的你可不要錯過了哈,希望本文對你提高知識有所幫助
    2013-02-02

最新評論