JavaScript必備知識 -- 原型與原型鏈

      網友投稿 916 2025-04-04

      原型


      JavaScript必備知識 -- 原型與原型鏈

      原型是function對象下的屬性,它定義了構造函數的共同祖先,也就是一個父子級的關系,子對象會繼承父對象的方法和屬性

      prototype是函數下的屬性,對象想要查看原型使用隱式屬性__Proto__

      constructor指向構造函數

      自己身上有屬性,原型上也有屬性,取近的,用自己的

      通過給原型添加屬性,可以讓所有的實例化對象共享屬性和方法

      Car.prototype = { height : 1400, lang : 4900, carName : 'BMW' } function Car() { } var car = new Car();

      原型鏈

      每個實例對象下都有__proto__屬性,通過屬性__proto__指向構造函數的原型對象,當到達末端時,返回null,這樣一層一層向頂端查找,就形成了原型鏈

      prototype是函數特有的,__proto__是對象有的,js中萬物皆對象

      prototype把共有屬性預先定義好,給之后對象使用

      prototype的存在實現了繼承,節省內存空間

      __proto__是對象的,prototype是函數的,因為函數也是對象,所以函數也有__proto__;

      __proto__的作用是就是當訪問一個對象的屬性時,如果該對象內部不存在這個屬性,那么就會沿著它的**__proto__**屬性所指向的那個對象(父對象)里找,也就是原型鏈

      prototype的作用是就是讓該函數所實例化的對象們都可以找到公用的屬性和方法

      __proto__對象原型的意義就在于為對象的查找機制提供一個方向,或者說一條路線,但是它是一個非標準屬性,因此實際開發中,不可以使用這個屬性,它只是內部指向原型對象 prototype

      constructor屬性存在于__proto__和prototype,它指向構造函數本身

      一般情況下,對象的方法都在構造函數的原型對象中設置。如果有多個對象的方法,我們可以給原型對象采取對象形式賦值,但是這樣就會覆蓋構造函數原型對象原來的內容,這樣修改后的原型對象 constructor 就不再指向當前構造函數了。此時,我們可以在修改后的原型對象中,添加一個 constructor 指向原來的構造函數。

      問題

      修改了函數的原型對象,constructor的指向是誰

      function Star(uname, age) { this.uname = uname; this.age = age; } // 很多情況下,我們需要手動的利用constructor 這個屬性指回 原來的構造函數 Star.prototype = { // 如果我們修改了原來的原型對象,給原型對象賦值的是一個對象,則必須手動的利用constructor指回原來的構造函數 constructor: Star, // 手動設置指回原來的構造函數 sing: function() { console.log('我會唱歌'); }, movie: function() { console.log('我會演電影'); } } var zxy = new Star('張學友', 19); console.log(zxy)

      在修改函數原型時,因為Star.prototype就是一個對象,所以constructor指向構造這個對象的原型,也就是object

      通過call``apply可以改變this的指向,借用別人的函數完成自己的功能

      區別:call傳多個參數 apply傳一個參數數組

      function Person(name,age,sex) { this.name = name; this.age = age; this.sex = sex; } function Student(name,age,sex,tel,grade) { //var this = {name: "lin", age: "19", sex: "male", tel: 123, grade: 78} Person.call(this,name,age,sex);//通過call改變this的指向這個函數 //Person.apply(this,[name,age,sex]) this.tel = tel; this.grade = grade; } var student = new Student('lin','19','male',123,78);

      創建一個空對象

      構造函數的this,繼承函數原型

      讓this指向構造函數的對象實例,執行構造函數內容為新對象添加屬性和方法

      返回this

      var obj = {}//創建空對象 obj.__proto__ = Person.prototype;//繼承作用域 Person.call(obj,)//改變this指向 //這三步是隱式的 var person = new Person();//new操作

      Prototype

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:WPS表格排序功能怎樣使用
      下一篇:怎么恢復刪除的數據(刪除的文件怎樣恢復)
      相關文章
      666精品国产精品亚洲 | 亚洲色大成网站www永久一区| 亚洲ts人妖网站| 亚洲天堂一区在线| 亚洲美女视频网站| 亚洲黄色高清视频| 亚洲精品永久www忘忧草| 91情国产l精品国产亚洲区| 亚洲人成电影在在线观看网色| 久久精品国产精品亚洲艾| 亚洲国产精品福利片在线观看| 久久亚洲国产欧洲精品一| 亚洲精品你懂的在线观看| 亚洲精品你懂的在线观看| 亚洲va中文字幕无码久久不卡| 亚洲国产精品嫩草影院在线观看| 亚洲精品乱码久久久久久| 亚洲国产精彩中文乱码AV| 亚洲av午夜成人片精品网站| 亚洲狠狠久久综合一区77777| 亚洲色图综合网站| 亚洲国产成人精品无码一区二区| 亚洲卡一卡2卡三卡4麻豆| 亚洲精品中文字幕无乱码麻豆| 2020天堂在线亚洲精品专区| 亚洲日韩精品无码专区加勒比☆ | 亚洲精品综合久久中文字幕| 亚洲黄色在线观看视频| 亚洲国产品综合人成综合网站| 亚洲1234区乱码| 亚洲精品自偷自拍无码| 亚洲a无码综合a国产av中文| 亚洲精品第一国产综合精品99| 久久亚洲国产成人影院网站| 亚洲国产日韩在线视频| 亚洲综合精品香蕉久久网97| 亚洲一区二区三区亚瑟| 国产成人精品久久亚洲高清不卡| 亚洲精品第一国产综合境外资源| 亚洲精品乱码久久久久久蜜桃不卡 | 亚洲一区免费在线观看|