欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js constructor的實(shí)際作用分析

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

<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>

說(shuō)下上面代碼里面 T.constructor = this這句話,我感覺(jué)這句話沒(méi)有什么實(shí)際作用,
本身T.constructor應(yīng)該是為Funtion,為什么要給它設(shè)定為Funtion的實(shí)例呢,
復(fù)制代碼 代碼如下:

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

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

<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);
//這種做法可以通過(guò)bb這個(gè)對(duì)象回朔到Animal的原型
alert(bb.constructor.prototype.constructor)
</script>

最后分析下constructor的實(shí)際作用
復(fù)制代碼 代碼如下:

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

復(fù)制代碼 代碼如下:

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

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

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

相關(guān)文章

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

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

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

    詳解js訪問(wèn)對(duì)象的屬性和方法

    在本篇文章里我們給大家分享了關(guān)于js訪問(wèn)對(duì)象的屬性和方法的相關(guān)知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。
    2018-10-10
  • 淺談JavaScript中指針和地址

    淺談JavaScript中指針和地址

    Javascript是一門(mén)基于對(duì)象的動(dòng)態(tài)語(yǔ)言,也就是說(shuō),所有東西都是對(duì)象,一個(gè)很典型的例子就是函數(shù)也被視為普通的對(duì)象。Javascript可以通過(guò)一定的設(shè)計(jì)模式來(lái)實(shí)現(xiàn)面向?qū)ο蟮木幊蹋渲衪his指針就是實(shí)現(xiàn)面向?qū)ο蟮囊粋€(gè)很重要的特性。
    2015-07-07
  • 微信小程序?qū)崿F(xiàn)藍(lán)牙打印

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

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

    全解跨域請(qǐng)求問(wèn)題處理方法及分析

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

    javascript寫(xiě)的簡(jiǎn)單的計(jì)算器,內(nèi)容很多,方法實(shí)用,推薦

    最近用javascript寫(xiě)了一個(gè)簡(jiǎn)單的計(jì)算器,自己測(cè)試感覺(jué)還好,代碼都給了注釋?zhuān)浅2诲e(cuò),推薦大家學(xué)習(xí)。
    2011-12-12
  • 基于Fixed定位的框選功能的實(shí)現(xiàn)代碼

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

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

    element-ui的表單驗(yàn)證清除校驗(yàn)提示語(yǔ)的解決方案

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

    js改變style樣式和css樣式的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇js改變style樣式和css樣式的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 用js寫(xiě)了一個(gè)類(lèi)似php的print_r輸出換行功能

    用js寫(xiě)了一個(gè)類(lèi)似php的print_r輸出換行功能

    因?yàn)閜hp的print_r比較好用同時(shí)js卻沒(méi)有這個(gè)功能于是自己就寫(xiě)了一個(gè),感興趣的你可不要錯(cuò)過(guò)了哈,希望本文對(duì)你提高知識(shí)有所幫助
    2013-02-02

最新評(píng)論