最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js constructor的實際作用分析

 更新時間:2011年11月15日 01:37:47   作者:  
大家討論下constructor的作用哈,需要的朋友可以參考下。從51js摘編而來。
復(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>

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

<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;既不給原型設(shè)置constructor屬性,而是給實例設(shè)置一個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);
//這種做法可以通過bb這個對象回朔到Animal的原型
alert(bb.constructor.prototype.constructor)
</script>

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

<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屬性
//正確的做法應(yīng)該是下面這樣,這樣諸如f.prototype.name的修改就不會破壞Function的原型了
f.prototype=new Function();
f.prototype.name="zhouyang";
/**關(guān)鍵是這里,再次調(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定義里設(shè)置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>

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

<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屬性
//正確的做法應(yīng)該是下面這樣,這樣諸如f.prototype.name的修改就不會破壞Function的原型了
f.prototype=new Function();
f.prototype.name="zhouyang";
/**關(guān)鍵是這里,再次調(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定義里設(shè)置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賜教一下,不知理解的是否正確哈,另外我看大家常說的原型的污染到底指的是什么??
作用的話下面這個或許可以說明
復(fù)制代碼 代碼如下:

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

相關(guān)文章

  • javascript 按鍵事件(兼容各瀏覽器)

    javascript 按鍵事件(兼容各瀏覽器)

    本篇文章主要是對javascript中的按鍵事件進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • uniapp封裝axios的詳細過程(大可不必那么麻煩)

    uniapp封裝axios的詳細過程(大可不必那么麻煩)

    在uniapp中使用axios進行請求時,uniapp無法使用axios的適配器,下面這篇文章主要給大家介紹了關(guān)于uniapp封裝axios的詳細過程,需要的朋友可以參考下
    2022-10-10
  • uniApp實現(xiàn)熱更新的思路與詳細過程

    uniApp實現(xiàn)熱更新的思路與詳細過程

    經(jīng)常在做app的時候,會有做熱更新的需求,這也是常用的更新app的一種手段,下面這篇文章主要給大家介紹了關(guān)于uniApp實現(xiàn)熱更新的思路與詳細過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • js圖片上傳的封裝代碼

    js圖片上傳的封裝代碼

    這篇文章主要為大家詳細介紹了js圖片上傳的封裝代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • SVG快速構(gòu)建馬賽克效果

    SVG快速構(gòu)建馬賽克效果

    這篇文章主要為大家介紹了SVG快速構(gòu)建馬賽克效果示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • webpack5搭建一個簡易的react腳手架項目實踐

    webpack5搭建一個簡易的react腳手架項目實踐

    本文文章主要介紹了webpack5搭建一個簡易的react腳手架項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Javascript實現(xiàn)商品秒殺倒計時(時間與服務(wù)器時間同步)

    Javascript實現(xiàn)商品秒殺倒計時(時間與服務(wù)器時間同步)

    在一些購物商城經(jīng)常看到有很多商品做秒殺活動,也就是倒計時,本篇文章給大家介紹Javascript實現(xiàn)商品秒殺倒計時(時間與服務(wù)器時間同步),需要的朋友可以了解下
    2015-09-09
  • 利用JS判斷字符串是否含有數(shù)字與特殊字符的方法小結(jié)

    利用JS判斷字符串是否含有數(shù)字與特殊字符的方法小結(jié)

    在我們?nèi)粘9ぷ鞯臅r候,利用javaScript判斷一個字符串中是否包括有數(shù)字和"-",在一些表單提交的地方,這是比較有用的常規(guī)判斷,這里收集有幾種不同的方法,最后還將簡要介紹下isNAN函數(shù)的使用方法和例子,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • layui 表格的屬性的顯示轉(zhuǎn)換方法

    layui 表格的屬性的顯示轉(zhuǎn)換方法

    今天小編就為大家分享一篇layui 表格的屬性的顯示轉(zhuǎn)換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • 輕松理解JavaScript閉包

    輕松理解JavaScript閉包

    閉包機制是JavaScript的重點和難點,本文希望能幫助大家輕松的學(xué)習(xí)閉包。下面跟著小編一起來看下吧
    2017-03-03

最新評論

枞阳县| 鲁甸县| 三门县| 内江市| 桐城市| 昌平区| 广德县| 德惠市| 巨野县| 旬邑县| 密云县| 东乡县| 涟源市| 繁峙县| 东阳市| 鄂伦春自治旗| 克什克腾旗| 拉萨市| 梁山县| 桃园县| 武山县| 永清县| 凤翔县| 额尔古纳市| 尚义县| 闽侯县| 深水埗区| 泗洪县| 普洱| 贵溪市| 文登市| 玛多县| 古蔺县| 社旗县| 大丰市| 崇左市| 车险| 尉犁县| 济南市| 景东| 驻马店市|