2021-04-21JS高級(jí)第二天

一昧辽、構(gòu)造函數(shù)和原型

1.靜態(tài)成員和實(shí)例成員(成員就是屬性和方法)

(1)實(shí)例成員就是構(gòu)造函數(shù)內(nèi)部通過(guò)this添加的成員 。實(shí)例成員只能通過(guò)實(shí)例化的對(duì)象來(lái)訪問(wèn)
(2)靜態(tài)成員 在構(gòu)造函數(shù)本身上添加的成員 卑雁。靜態(tài)成員只能通過(guò)構(gòu)造函數(shù)來(lái)訪問(wèn)

 function Star(uname, age) {
     this.uname = uname;  //實(shí)例成員
     this.age = age;  //實(shí)例成員
     this.sing = function() {  //實(shí)例成員
     console.log('我會(huì)唱歌');
    }
}
Star.sex = '男';  //靜態(tài)成員
var ldh = new Star('劉德華', 18);
console.log(Star.sex);//靜態(tài)成員只能通過(guò)構(gòu)造函數(shù)來(lái)訪問(wèn)
2.構(gòu)造函數(shù)原型prototype

(1)每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype 屬性跌榔,prototype是一個(gè)對(duì)象地熄。
(2)一般情況下叉讥,我們把構(gòu)造函數(shù)的公共方法放到原型對(duì)象prototype里面窘行,實(shí)現(xiàn)方法共享。

function Star(uname, age) {
          this.uname = uname;
          this.age = age;
        }

        // 構(gòu)造函數(shù)的公共方法寫(xiě)到原型對(duì)象里面
        Star.prototype.sing = function (song) {
          console.log(this.uname + '會(huì)唱' + song);
        };
        var WuLei = new Star('吳磊',22);
        WuLei.sing('苦樂(lè)年華');
3._proto_對(duì)象原型

(1)每個(gè)實(shí)例對(duì)象中都有一個(gè)_proto_屬性图仓,它指向構(gòu)造函數(shù)中的原型對(duì)象prototype罐盔。
(2)_proto_對(duì)象原型和原型對(duì)象 prototype 是等價(jià)的。也是對(duì)象
(3)實(shí)例對(duì)象調(diào)用方法時(shí)救崔,先去查找本身是否有該方法翘骂;再去prototype原型對(duì)象中查找。

4.constructor屬性

(1)對(duì)象原型( __ proto__)和構(gòu)造函數(shù)的原型對(duì)象(prototype)里面都有一個(gè)屬性 constructor 屬性 帚豪,constructor 我們稱為構(gòu)造函數(shù),它指回構(gòu)造函數(shù)本身草丧。
(2)如果給prototype原型對(duì)象賦值為一個(gè)對(duì)象類型的數(shù)據(jù),會(huì)覆蓋原本的對(duì)象狸臣,則必須手動(dòng)地把constructor指回原來(lái)的構(gòu)造函數(shù)

     function Star(uname, age) {
          this.uname = uname;
          this.age = age;
        }
        // 對(duì)象原型( __proto__)和構(gòu)造函數(shù)的原型對(duì)象(prototype)里面都有一個(gè)屬
        // 性 constructor 屬性 昌执,constructor 我們稱為構(gòu)造函數(shù)烛亦,因?yàn)樗富貥?gòu)造函數(shù)本身。
        Star.prototype = {
          constructor: Star, //在原型對(duì)象中手動(dòng)將constructor屬性指向構(gòu)造函數(shù)
          sing: function () {
            console.log('我會(huì)唱歌');
          },
          film: function () {
            console.log('我會(huì)演電影');
          },
        };
        var star = new Star('吳磊', 22);
5.實(shí)例對(duì)象原型( _proto_)懂拾、構(gòu)造函數(shù)(prototype)原型對(duì)象煤禽、constructor屬性

(1)構(gòu)造函數(shù)通過(guò)prototype指向子屬性原型對(duì)象prototype。
(2)原型對(duì)象prototype通過(guò)子屬性constructor指向構(gòu)造函數(shù)岖赋。
(3)實(shí)例對(duì)象通過(guò)_proto_對(duì)象原型與構(gòu)造函數(shù)的原型對(duì)象prototype等價(jià)檬果。

6.原型鏈

構(gòu)造函數(shù)(prototype)原型對(duì)象也是一個(gè)對(duì)象,也有對(duì)象原型(_proto_)唐断,它指向Object的原型對(duì)象(prototype)选脊。

原型鏈.PNG

7.實(shí)例對(duì)象調(diào)用屬性和方法時(shí)的查找機(jī)制

(1)首先查找這個(gè)對(duì)象自身有沒(méi)有該屬性。
(2)如果沒(méi)有就查找它的原型對(duì)象 (也就是 __ proto__指向的 prototype 原型對(duì)象)脸甘。
(3)如果還沒(méi)有恳啥,就查找原型對(duì)象的對(duì)象原型(指向的是Object的原型對(duì)象)。
(4)_proto_對(duì)象原型的意義就在于為對(duì)象成員查找機(jī)制提供一個(gè)方向丹诀,或者說(shuō)一條路線钝的。

8.this指向

構(gòu)造函數(shù)中的this和原型對(duì)象的this,都指向我們new出來(lái)的實(shí)例對(duì)象翁垂。

9.利用prototype原型對(duì)象擴(kuò)展內(nèi)置對(duì)象方法

(1)構(gòu)造函數(shù).prototype.新方法( ) = function( ){ }
  這是給原型對(duì)象追加新方法。
(2)構(gòu)造函數(shù).prototype = { 新方法1 : function( ) { } 硝桩,新方法2 : function( ) { } }
  這種形式會(huì)覆蓋原型對(duì)象prototype原本的內(nèi)容沿猜。禁止用這種形式擴(kuò)展內(nèi)置對(duì)象方法。

        // 為數(shù)組添加自定義方法
        Array.prototype.sum = function () {
          var sum = 0;
          for (var i = 0; i < this.length; i++) {
            sum += this[i];
          }
          return sum;
        };

        //實(shí)例化數(shù)組對(duì)象
        var arr = new Array(11,22,33);
        console.log(arr.sum());
      });
10.call( )方法

方法名.call (this的指向, 參數(shù)1亿柑,參數(shù)2)

call( )方法可以調(diào)用函數(shù)邢疙;改變函數(shù)的this指向

      function fn(x, y) {
          console.log(x + y);
          console.log(this);
        }

        var o = {};

        fn.call(o,1,2);//調(diào)用函數(shù)望薄,并將fn函數(shù)的this指向改為對(duì)象o
11.子構(gòu)造函數(shù)繼承父構(gòu)造函數(shù)

核心:(1)在子構(gòu)造函數(shù)里調(diào)用父構(gòu)造函數(shù)疟游;把父構(gòu)造函數(shù)的this指向修改為子構(gòu)造函數(shù)。
  『壑А(2)把父構(gòu)造函數(shù)的實(shí)例化對(duì)象賦值給子原型對(duì)象颁虐。
   (3)用對(duì)象賦值的方法會(huì)覆蓋子原型對(duì)象的內(nèi)容卧须,要手動(dòng)把子原型對(duì)象的constructor屬性指回子構(gòu)造函數(shù)另绩。

           function Father(uname,age){
                this.uname = uname;
                this.age = age;
            }

            function Son(u_uname,a_age,weight){
                Father.call(this,u_uname,a_age);//1.子構(gòu)造函數(shù)調(diào)用父構(gòu)造函數(shù)
                this.weight = weight;
            }

            Son.prototype = new Father();//2.將父構(gòu)造函數(shù)的實(shí)例對(duì)象賦值給子原型對(duì)象
            Son.prototype.constructor = Son;//3.將子原型對(duì)象的constructor屬性指回子構(gòu)造函數(shù)

            // 實(shí)例化子構(gòu)造函數(shù)
            var son = new Son('吳磊',22,'60kg')
            console.log(son);

12.類class的本質(zhì)是構(gòu)造函數(shù)。

二花嘶、ES5新增的方法

forEach笋籽、filter、some方法的后面兩個(gè)參數(shù)可以省略椭员,只寫(xiě)一個(gè)參數(shù)就代表每個(gè)數(shù)組元素车海。

1.數(shù)組方法forEach( )遍歷數(shù)組(對(duì)象也有)

數(shù)組名.forEach( function(item, index , array ) { } )
item:每一個(gè)數(shù)組元素
index:每一個(gè)數(shù)組元素的索引號(hào)
array:數(shù)組對(duì)象本身

var arr = [0, 1, 2];
      arr.forEach(function (item, index, array) {
        console.log('每一個(gè)數(shù)組元素' + item);
        console.log('每一個(gè)元素的索引號(hào)' + index);
        console.log('數(shù)組對(duì)象本身' + array);
      });
2.數(shù)組方法filter( )篩選數(shù)組元素

var 新數(shù)組名 = 數(shù)組名.filter( function( item, index , array ) { } )
item:每一個(gè)數(shù)組元素
index:每一個(gè)數(shù)組元素的索引號(hào)
array:原數(shù)組對(duì)象本身

注意:filter( )方法會(huì)遍歷原數(shù)組,并把所有符合要求的元素篩選出來(lái),一定要加return隘击,返回值是一個(gè)新數(shù)組侍芝。

        var arr = [10,22,35,40];
        var newArr = arr.filter(function(item,index,array){
            return item% 2 == 0;//返回偶數(shù)裝到新數(shù)組中
        })
        console.log(newArr);
3.數(shù)組方法some( )查找是否有滿足條件的數(shù)組元素

var flag = 數(shù)組名.some( function( item, index , array ) { } )
item:每一個(gè)數(shù)組元素
index:每一個(gè)數(shù)組元素的索引號(hào)
array:原數(shù)組對(duì)象本身

注意:(1)some( )方法會(huì)遍歷數(shù)組,判斷是否有元素滿足要求埋同,返回值是布爾值州叠。
   (2)some( )方法查找到第一個(gè)滿足要求的元素后凶赁,立即停止循環(huán)遍歷咧栗。
   (3)return true可以停止some( )方法的循環(huán)哟冬。另外兩個(gè)方法不行楼熄。
   (4)注意return true 的位置浩峡,寫(xiě)到 if 判斷語(yǔ)句中可岂。

      var arr = [12, 45, 2, 67];
      var flag = arr.some(function (item, index, array) {
        if(item>= 100)
        return true;//判斷是否有滿足要求的條件
      });
      console.log(flag);

實(shí)際應(yīng)用:查詢并操作數(shù)組中的唯一元素時(shí),用some()效率更高翰灾。

          var arr = [];
          data.some(function (value) {
            if (product.value === value.pname) {
              arr.push(value);
              return true;
            }
          }
4.字符串方法trim( )去除字符串兩側(cè)空格

字符串.trim( )

注意:trim( )方法可以去除字符串兩側(cè)的空格缕粹,但不會(huì)對(duì)字符串中間的空格有影響稚茅。返回值是一個(gè)新字符串。

5.獲取對(duì)象的屬性名

var arr = Object.keys(對(duì)象名)
注意:返回值是一個(gè)數(shù)組平斩,里面是對(duì)象的屬性名集合亚享。

 var obj = {
     id: 1,
     pname: '小米',
     price: 1999,
     num: 2000
};
var result = Object.keys(obj)
console.log(result)//[id,pname,price,num]
6.修改與設(shè)置對(duì)象的屬性

Object.defineProperty( 要修改的對(duì)象绘面,要修改或新增的屬性欺税,{})

  • 三個(gè)參數(shù)都是必須屬性,第三個(gè)參數(shù)是對(duì)象揭璃,屬性如下:
    (1)value:修改或新增的屬性的值
    (2)writable:true / false晚凿。默認(rèn)值為false ,不允許修改這個(gè)屬性值瘦馍。
    (3)enumerable:true / false歼秽。 默認(rèn)值為false ,不允許遍歷這個(gè)屬性情组。
    (4)configurable: true / false燥筷。 默認(rèn)值為false,不允許刪除這個(gè)屬性院崇。并且configurable的值不能二次修改肆氓。
      var WuLei = {
          uname: '吳磊',
          age: 22,
          height: 183,
        };

        // 添加屬性
        Object.defineProperty(WuLei, 'hobby', {
          value: '擼鐵',
          writeable: false,
          enumerable: false,
          configurable: false
        });

        // writeable設(shè)置為false,則不允許再修改hobby的value值
        WuLei.hobby = '擼串'
        console.log( WuLei.hobby);

        //enumerable設(shè)置為false,獲取WuLei的屬性名集合時(shí)底瓣,就沒(méi)有hobby
        var arr = Object.keys(WuLei);
        console.log(arr);

        // configurable設(shè)置為false,不允許刪除hobby屬性
        delete WuLei.hobby;
        console.log(WuLei);
7. map 函數(shù)

var newArr = arr.map(function(item,value,arr){ })

(1)map方法會(huì)遍歷數(shù)組做院,每個(gè)數(shù)組元素都會(huì)執(zhí)行回調(diào)函數(shù)。
(2)map方法的回調(diào)函數(shù)中濒持,必須有 return,返回的數(shù)據(jù)被 存入新數(shù)組中寺滚。
(3)map方法返回值是一個(gè) 新數(shù)組柑营,不會(huì)改變?cè)瓉?lái)數(shù)組。

8. filter和map的區(qū)別
let arr=[2,4,1,5,3,1];

let res1=arr.map(function (item,index,array) {
  // return array[index]; //用這種方法也可以獲取到當(dāng)前處理的元素
  return item>1;
});

let res2=arr.filter(function (item,index,array) {
  return item>1;
});
console.log(res1,res2);//[ true, true, false, true, true, false ] [ 2, 4, 5, 3 ]

map的結(jié)果只是對(duì)當(dāng)前元素調(diào)用函數(shù)后(x是否大于1)的結(jié)果村视。而filter 會(huì)將結(jié)果為true的數(shù)組存到新的數(shù)組里面官套。

三、補(bǔ)充

1.for... in

for (index in 數(shù)組/對(duì)象)

for...in 語(yǔ)句用于對(duì)數(shù)組或者對(duì)象的屬性進(jìn)行循環(huán)操作蚁孔。

for ... in 循環(huán)中的代碼每執(zhí)行一次奶赔,就會(huì)對(duì)數(shù)組的元素或者對(duì)象的屬性進(jìn)行一次操作。

var x
var mycars = new Array()
mycars[0] = "Saab"
mycars[1] = "Volvo"
mycars[2] = "BMW"

for (x in mycars)
{
document.write(mycars[x] + "<br />")
}
2.for ... of

for( const value of 被遍歷的數(shù)據(jù))

①for...of 語(yǔ)句用于循環(huán)遍歷杠氢。
②在 ES6 中引入的 for...of 循環(huán)站刑,以替代 for...in 和 forEach() ,并支持新的迭代協(xié)議鼻百。
③for...of 允許遍歷 Arrays(數(shù)組), Strings(字符串), Maps(映射), Sets(集合)等可迭代的數(shù)據(jù)結(jié)構(gòu)等绞旅。
④不能遍歷對(duì)象Object摆尝。

function args() {
  for (const arg of arguments) {
    console.log(arg);
  }
}
 
args('a', 'b', 'c');
// Output:
// a
// b
// c

const arr = ['mini', 'mani', 'mo'];
for (const value of arr) {
  console.log(value);
}
 
// Output:
// mini
// mani
// mo

小結(jié)

(1)構(gòu)造函數(shù)有原型對(duì)象prototype
(2)原型對(duì)象prototype有constructor屬性,指向構(gòu)造函數(shù)
(3)構(gòu)造函數(shù)可以通過(guò)原型對(duì)象prototype添加方法因悲。
(4)構(gòu)造函數(shù)的實(shí)例對(duì)象有_proto_屬性堕汞,指向構(gòu)造函數(shù)的原型對(duì)象prototype

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市晃琳,隨后出現(xiàn)的幾起案子讯检,更是在濱河造成了極大的恐慌,老刑警劉巖卫旱,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件人灼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡誊涯,警方通過(guò)查閱死者的電腦和手機(jī)挡毅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)暴构,“玉大人跪呈,你說(shuō)我怎么就攤上這事∪∮猓” “怎么了耗绿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)砾隅。 經(jīng)常有香客問(wèn)我误阻,道長(zhǎng),這世上最難降的妖魔是什么晴埂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任究反,我火速辦了婚禮,結(jié)果婚禮上儒洛,老公的妹妹穿的比我還像新娘精耐。我一直安慰自己,他們只是感情好琅锻,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布卦停。 她就那樣靜靜地躺著,像睡著了一般恼蓬。 火紅的嫁衣襯著肌膚如雪惊完。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天处硬,我揣著相機(jī)與錄音小槐,去河邊找鬼。 笑死荷辕,一個(gè)胖子當(dāng)著我的面吹牛本股,可吹牛的內(nèi)容都是我干的攀痊。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拄显,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼苟径!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起躬审,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棘街,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后承边,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體遭殉,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年博助,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了险污。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡富岳,死狀恐怖蛔糯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窖式,我是刑警寧澤蚁飒,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站萝喘,受9級(jí)特大地震影響淮逻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阁簸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一爬早、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧启妹,春花似錦凸椿、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)髓抑。三九已至咙崎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吨拍,已是汗流浹背褪猛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羹饰,地道東北人伊滋。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓碳却,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親笑旺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昼浦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一、 JS面向?qū)ο缶幊?1筒主、 面向?qū)ο蠼榻B 什么是對(duì)象关噪? Everything is object (萬(wàn)物皆對(duì)象)...
    寵辱不驚丶?xì)q月靜好閱讀 824評(píng)論 0 2
  • 學(xué)習(xí)目標(biāo): 理解面向?qū)ο箝_(kāi)發(fā)思想 掌握 JavaScript 面向?qū)ο箝_(kāi)發(fā)相關(guān)模式 掌握在 JavaScript ...
    金桔檸檬加冰閱讀 402評(píng)論 0 0
  • 1、面向?qū)ο蟮娜筇卣鳎悍庋b乌妙、繼承使兔、多態(tài)。 封裝:就是將方法封裝在對(duì)象中藤韵,只給出接口就可以調(diào)用虐沥,利于維護(hù)泽艘,避免...
    js66閱讀 217評(píng)論 0 0
  • 一欲险、JavaScript高級(jí)第一天 1.JavaScript基礎(chǔ)知識(shí)復(fù)習(xí) JavaScript的基本組成 Java...
    海棠未雨閱讀 195評(píng)論 0 0
  • 學(xué)習(xí)目標(biāo): 理解面向?qū)ο箝_(kāi)發(fā)思想 掌握 JavaScript 面向?qū)ο箝_(kāi)發(fā)相關(guān)模式 掌握在 JavaScript ...
    小青年coder閱讀 979評(píng)論 0 2