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

慎用 somefunction.prototype 分析

 更新時間:2009年06月02日 16:35:59   作者:  
在寫 JavaScript 腳本的時候,為了創(chuàng)建一個類,如果不使用框架,一般情況我們都會使用 prototype 來給要創(chuàng)建的類增加公有方法
復制代碼 代碼如下:

// code from jb51.net
function Person(name) {
this.Name = name;
}
Person.prototype.SayHello = function() {
alert('Hello, ' + this.Name);
}
Person.prototype.SayBye = function() {
alert('Goodbye, ' + this.Name);
}

不過,有的時候,為了書寫以及維護的方便,我們會把公有方法的聲明寫到一個對象里,然后賦值給 Person.prototype,例如:
復制代碼 代碼如下:

// code from jb51.net
function Person(name) {
this.Name = name;
}
Person.prototype = {
SayHello: function() {
alert('Hello, ' + this.Name);
},
SayBye: function() {
alert('Goodbye, ' + this.Name);
}
}

使用這種方式,在這個類具有大量公有方法的時候,就不需要維護許多的 Person 標識符,如果某一天這個類的名字需要改變,那么要改的地方只有兩個,一個是 function 的聲明,一個是 prototype 前面的標識符,如果是使用前一種方式的話,那么有多少個公有方法,就需要維護 N+1 個標識符了,雖然可以使用查找替換,但是從穩(wěn)定上來說,查找替換可能會引起一些錯誤,這增加了維護的成本。

這種方式雖然給我們的維護增加了便利,但也引發(fā)了另外一個隱藏的問題,就是類的 constructor 屬性丟失的問題。
復制代碼 代碼如下:

// code from jb51.net
function Person1(name) {
this.Name = name;
}
Person1.prototype.SayHello = function() {
alert('Hello, ' + this.Name);
}
Person1.prototype.SayBye = function() {
alert('Goodbye, ' + this.Name);
}
// code from jb51.net
function Person2(name) {
this.Name = name;
}
Person2.prototype = {
SayHello: function() {
alert('Hello, ' + this.Name);
},
SayBye: function() {
alert('Goodbye, ' + this.Name);
}
}
alert(new Person1('Bill').constructor);
alert(new Person2('Steve').constructor);

運行上面的測試代碼我們可以發(fā)現(xiàn),Person1 的 constructor 屬性為 Person1 類的構造函數(shù),但是 Person2 的 constructor 屬性卻是 Object,那么在需要使用 constructor 屬性來判斷對象類型的時候,就會出現(xiàn)問題。
因此,在寫 JavaScript 類的時候,如果不需要使用 constructor 屬性來獲取對象的類型,那么個人比較傾向于使用第二種寫法,但是如果需要使用 constructor 屬性以實現(xiàn)自己的反射機制或 GetType 函數(shù)等等,那么就要使用第一種寫法。
當然,如果在實現(xiàn)自己反射機制或 GetType 函數(shù)時并不依賴 constructor 屬性,那么兩種寫法都是可以的了,例如額外維護一個成員變量,用于標識自身的類型等。也可以使用一些現(xiàn)成的JS框架,有一些框架已經實現(xiàn)了JS中類的實現(xiàn)等,例如 js.class,這就看個人需要進行取舍了。

相關文章

  • js修改元素樣式的九種方式總結

    js修改元素樣式的九種方式總結

    用慣了vue和react之后可能會慢慢淡忘掉原生的一些操作dom的幾種方式,有的時候確實需要我們通過原生的方式進行操作,下面這篇文章主要給大家介紹了關于js修改元素樣式的九種方式,需要的朋友可以參考下
    2024-04-04
  • JS實現(xiàn)隔行換色的表格排序

    JS實現(xiàn)隔行換色的表格排序

    本篇文章主要介紹了JS實現(xiàn)隔行換色的表格排序的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • js驗證IP及子網掩碼的合法性有效性示例

    js驗證IP及子網掩碼的合法性有效性示例

    這篇文章主要介紹了js驗證IP及子網掩碼的有效性,需要的朋友可以參考下
    2014-04-04
  • JavaScript 日期時間選擇器一些小結

    JavaScript 日期時間選擇器一些小結

    flatpickr 是一個輕量級、注重精益、由 UX 驅動和可擴展的 JavaScript 日期時間選擇器。這篇文章主要介紹了JavaScript 日期時間選擇器,需要的朋友可以參考下
    2018-04-04
  • JavaScript出現(xiàn)setTimeout倒計時誤差的原因分析

    JavaScript出現(xiàn)setTimeout倒計時誤差的原因分析

    setTimeout?倒計時誤差的出現(xiàn)主要與?JavaScript?的事件循環(huán)機制和計時器的執(zhí)行方式有關,本文就來和大家講講具體出現(xiàn)的原因以及解決方法,需要的可以參考一下
    2023-06-06
  • js控制臺輸出的方法(詳解)

    js控制臺輸出的方法(詳解)

    下面小編就為大家?guī)硪黄猨s控制臺輸出的方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Js中var,let,const的區(qū)別你知道嗎

    Js中var,let,const的區(qū)別你知道嗎

    眾所周知在Javascript中,var、let、const都可用于變量聲明,但是之前沒有梳理過它們之間的區(qū)別,下面這篇文章主要給大家介紹了關于Js中var,let,const區(qū)別的相關資料,需要的朋友可以參考下
    2023-02-02
  • javascript 中的 delete及delete運算符

    javascript 中的 delete及delete運算符

    這篇文章主要介紹了javascript 中的 delete及delete運算符的相關資料,需要的朋友可以參考下
    2015-11-11
  • javascript實現(xiàn)顏色漸變的方法

    javascript實現(xiàn)顏色漸變的方法

    這篇文章介紹了javascript實現(xiàn)顏色漸變的方法,有需要的朋友可以參考一下
    2013-10-10
  • Bootstrap實現(xiàn)圓角、圓形頭像和響應式圖片

    Bootstrap實現(xiàn)圓角、圓形頭像和響應式圖片

    這篇文章主要介紹了Bootstrap實現(xiàn)圓角、圓形頭像和響應式圖片的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評論

绥江县| 自治县| 岳西县| 阿城市| 金堂县| 浮山县| 蛟河市| 虎林市| 治县。| 福建省| 电白县| 新宁县| 成武县| 丹东市| 宝鸡市| 融水| 怀仁县| 咸阳市| 三都| 陆丰市| 灵川县| 二连浩特市| 芷江| 潼南县| 山东省| 利辛县| 蚌埠市| 大同市| 涞水县| 阳谷县| 岳普湖县| 南汇区| 小金县| 镇赉县| 深圳市| 温宿县| 福鼎市| 泸西县| 嵊州市| 金塔县| 通许县|