国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

快醒醒,帶你穿過原型和原型鏈的迷霧

開發 前端
對于初學js的繼承機制--”原型“和”原型鏈“這兩個概念的理論時,總是忘了記、記了忘。所以死記硬背真的是沒得用的,得深入理解其背后的設計思想,得理解加記憶,如虎添翼。至于為什么這樣說,就隨著這篇文章去揭開珍妮的面紗,如剝洋蔥般去探究它的本質。

1.寫在前面

我們知道在面向對象編程的語言中,有一句統籌全局的中心句--”萬物皆對象“,原型和原型鏈也是基于這個基礎理解的。

對于初學js的繼承機制--”原型“和”原型鏈“這兩個概念的理論時,總是忘了記、記了忘。所以死記硬背真的是沒得用的,得深入理解其背后的設計思想,得理解加記憶,如虎添翼。

至于為什么這樣說,就隨著這篇文章去揭開珍妮的面紗,如剝洋蔥般去探究它的本質。

來不及解釋,快上車。

2.JS繼承的設計思想

我們知道創建對象有兩種方式:一種是最常見的對象字面量,一種就是常說的通過new來創建對象實例。其實這兩種方式描述的對象都是等價的,屬性和方法都是一致的。

// 字面量對象
let obj = {
name:"yichuan",
age:18,
sayName(){
console.log("name: ", this.name);
}
}

// new創建對象實例
let obj2 = new Object();
obj2.name = "pingping";
obj2.sayName = function(){
console.log("name: ", this.name);
}

使用對象字面量或者Object構造函數可以輕松創建對象,但是在創建具有同樣接口的多個對象時,會重復編寫很多代碼。那么,我們想可不可以創建一個容器,將共享的屬性和方法存在里面,這樣就可以在多個對象中使用。

在es6之前沒有正式支持類和繼承的結構,但是能夠通過原型鏈繼承進行模仿實現類和繼承。事實上,es6的類也的確是封裝了構造函數和原型繼承的語法糖。

工廠模式

工廠模式可以用于抽象創建特定對象過程,解決創建多個類似對象的問題,但是沒有解決對象標識的問題,不能設置新創建對象的類型。

// 工廠模式
function createPerson(name, age, city){
let obj = new Object();
obj.name = name;
obj.age = age;
obj.city = city;
obj.sayName = function(){
console.log("my name is : ", this.name);
}
return obj;
}

let preson1 = createPerson("yichuan",18,"BeiJing");
let preson2 = createPerson("onechuan",28,"GuangZhou");

構造函數模式

在js中構造函數是用于創建特定類型對象的,在前面使用了Object原生構造函數創建對象,運行時可以直接在執行環境中使用。但其實,我們也可以進行自定義構造函數,用函數的形式為自己的對象定義屬性和方法。


// 構造函數模式
function Person(name, age, city){
this.name = name;
this.age = age;
this.city = city;
this.sayName = function(){
console.log(this.name);
}
}

let p1 = new Person("yichuan",18,"Beijing")
let p2 = new Person("onechuan",19,"Guangzhou")
p1.sayName()//yichuan
p2.sayName()//onechuan

構造函數模式相比于工廠模式而言,沒有顯式創建對象,屬性和方法都是直接賦給this,也沒有return返回任何值。

那么使用new構造函數的方式創建對象,具體會發生什么?

會有如下操作:

1)在內存中開辟新的空間創建新對象。

2)這個新對象內部的_proto_特性被賦值為構造函數的prototype屬性

3)構造函數內部的this指向新對象

4)給新對象添加屬性

5)如果構造函數返回非空對象,則返回該對象;否則,返回剛創建的新對象

構造函數是什么?

其實構造函數也是函數,和普通函數沒啥區別,只是調用的方式不同而已,通過new調用的函數是構造函數。構造函數定義的方法會在每個實例上都創建一遍,每次定義函數時,都會初始化一個對象。

function Person(name, age, city){
this.name = name;
this.age = age;
this.city = city;
this.sayName = new Function("console.log(this.name);");
}

原型模式

每個函數都會創建一個prototype屬性,這個屬性是一個對象,包含應該由特定引用類型的實例共享的屬性和方法,而這個對象就是通過調用構造函數創建的實例對象的原型,那么這個對象就叫做原型對象。

原型對象的作用是:在原型對象上定義的屬性和方法可以被對象實例所共享,即對象原型相當于一個存儲公共屬性和方法的容器。

等等,這不就是前面所說的構造器中直接賦值給對象實例的值嗎?

其實不是,其實在進行構造函數Person定義時,構造函數內部是個空對象,沒有任何屬性和方法。然而,可以通過在Person的prototype上直接定義屬性和方法,來掛載到Person對象的原型上。這樣通過new Person()得到的對象實例是可以共享Person.prototype上的屬性和方法。如下所示:

function Person(){}

Person.prototype.name = "yichuan";
Person.prototype.age = 18;
Person.prototype.city = "Beijing";
Person.prototype.sayName = function(){
console.log(this.name);
}

let p1 = new Person();
p1.sayName();
let p2 = new Person();
p2.sayName();

3.原型和原型鏈

上面的原型模式中,已經將原型和原型對象的概念引出來了,那么我們重新整理下思路:

構造函數的prototype屬性指向的原型對象中,定義了所有實例對象都能夠共享的屬性和方法,而不需要共享的屬性和方法則直接定義在構造函數上。

通過構造函數創建的實例對象,會自動擁有原型對象上共享的屬性或方法。

function Person(name){
this.name = name;
}
Person.prototype.address = "earth";
const p = new Person("yichuan");//{name:age}
const p1 = new Person("onechuan");

在上面代碼中,在構造函數Person的prototype原型上定義了一個公共屬性 Person.prototype.address="earth";,那么通過new出來的實例對象p和p1都會天生繼承屬性address,而p和p1各自的name值分別為"yichuan"和"onechuan"。

函數與對象的關系

  • 函數是對象,對象都是通過函數創建的
  • 函數與對象并不是簡單的包含與被包含的關系

原型的類別

  • 顯式原型:prototype,是每個函數function獨有的屬性
  • 隱式原型:_proto_,是每個對象都具有的屬性

原型和原型鏈

  • 原型:一個函數可以看做一個類,原型是所有類都有的一個屬性,prototype原型的作用就是給這個類的每個對象都添加一個統一的方法。
  • 原型鏈:每個對象都有一個_proto_,它指向它的prototype原型對象;它的prototype原型對象又有一個_proto_,指向它的prototype原型對象,就這樣向上查找原型,直到頂級對象Object.prototype,最終指向是null

用圖片描述原型鏈:

我們看到原型鏈的最終歸屬都是對象,而Object.prototype的_proto_指向的是null,這是為了避免死循環而設置的,所以一切皆空。

4.參考文章

【重點】圖解:告訴面試官什么是 JS 原型和原型鏈?

面不面試的,你都得懂原型和原型鏈

《Javascript高級程序設計》

5.寫在最后

所有實例對象的_proto_都指向該構造函數的prototype原型對象 (即:p._proto_ === Person.prototype)。

所有函數(包括構造函數)都是Function的實例,所有函數的_proto_都指向Function的原型對象

所有的原型對象(包括 Function的原型對象)都是Object的實例,所以_proto_都指向 Object(構造函數)的原型對象。而Object構造函數的 _proto_指向 null。

Function構造函數本身就是Function的實例,所以_proto_指向Function的原型對象。

責任編輯:武曉燕 來源: 前端一碼平川
相關推薦

2020-02-20 14:00:15

JavaScript原型原型鏈

2020-09-10 07:04:30

JSJavaScript 原型鏈

2020-10-20 08:35:34

JS基礎進階

2012-01-05 15:07:11

JavaScript

2012-11-08 10:40:47

JavaScript原型鏈

2017-04-07 11:15:49

原型鏈原型Javascript

2019-02-27 16:00:48

JS原型原型鏈對象

2023-08-28 07:12:54

2022-05-26 09:20:01

JavaScript原型原型鏈

2016-06-07 14:28:39

Javascript原型

2017-05-05 10:31:35

JavaScriptprototype__proto__

2022-03-29 09:15:55

Javascript函數屬性

2016-12-27 09:10:29

JavaScript原型鏈繼承

2016-05-06 14:02:18

JavaScript原型鏈

2024-08-09 12:44:45

JavaScript原型鏈鏈條

2015-06-09 10:55:58

JavaScriptinstanceof運

2022-06-20 09:22:55

js原型鏈前端

2023-04-07 09:07:11

2011-08-31 14:48:33

JavaScript

2023-05-30 15:06:21

JavaScript屬性開發
點贊
收藏

51CTO技術棧公眾號

在线中文字幕资源| 欧美色网在线| 久久久久久久午夜| 91在线观看免费网站| 中文字幕日韩专区| 中文在线不卡视频| 久久99亚洲精品| 18久久久久久| 38少妇精品导航| 国产精品网站大全| 国产精品女视频| 精品久久久久久亚洲| 欧美精品久久久久久久免费| 无码精品a∨在线观看中文| 日本国产在线| 91一区二区三区在线| 蜜芽在线免费观看| 欧美精品第一区| 国产综合色视频| 亚洲一区二区精品3399| 在线播放国产精品| 欧美一区二区影院| 91久久在线视频| 国产区在线视频| 成人嘿咻视频免费看| 大伊人狠狠躁夜夜躁av一区| 国产毛片av在线| 亚洲欧美日韩国产一区二区三区| 91精品国产高清久久久久久久久| 色一情一区二区三区四区| 伊人网在线播放| 欧美日韩伦理在线免费| 日韩欧美成人精品| 国产精品色悠悠| 精品国产一区二区三区2021| 四虎影院观看视频在线观看| 亚洲片区在线| 在线观看日韩精品| 欧美中文在线观看| 在线免费观看成人| 日韩男人天堂| 亚洲高清激情| 日韩免费在线看| 亚洲人体影院| 亚洲色图18p| 亚洲淫性视频| 在线播放日韩精品| 韩国理伦片久久电影网| 99国产在线视频| 7777久久香蕉成人影院| 4k岛国日韩精品**专区| 在线日韩电影| 国产一二三四区在线观看| 麻豆极品一区二区三区| 日韩av高清在线看片| 国产精品亲子伦对白| 亚洲色图 在线视频| 亚洲欧美日韩一区二区 | 久久综合网hezyo| 在线观看的av网站| 136国产福利精品导航| 精东影业在线观看| 日韩精品视频中文在线观看| 丁香婷婷成人| 红桃一区二区三区| 色又黄又爽网站www久久| 澳门av一区二区三区| 99久久无色码| 欧美国产成人精品| 日韩pacopacomama| 久久av一区二区三区亚洲| 国产日韩欧美高清| 亚洲欧洲国产精品一区| 男操女免费网站| 国产欧美一区二区三区在线| 欧美性猛交xxxx免费看漫画| 亚洲天堂偷拍| 懂色av色香蕉一区二区蜜桃| 免费动漫网站在线观看| 欧美a在线视频| 欧美成人午夜电影| 亚洲国产成人私人影院tom| 极品av少妇一区二区| 中文.日本.精品| 在线观看视频污| 老司机av福利| 国产精品丝袜一区二区三区| 精品国产凹凸成av人导航| 妺妺窝人体色www在线小说| 91chinesevideo永久地址| 欧美在线综合视频| 成人午夜视频福利| 国产一区二区三区四区老人| 欧美日韩五区| 69久久精品| 欧美男女交配视频| 亚洲成人自拍| 国产精品国语对白| 九九热在线精品视频| 日韩精品视频在线播放| 在线观看一区不卡| 欧美日韩亚洲综合| 久久精品综合网| 美女网站在线免费欧美精品| 日韩一区电影| a∨色狠狠一区二区三区| 午夜激情在线观看| 四虎免费av| 韩国日本在线视频| 宅男一区二区三区| 精品日产一区2区三区黄免费| 国内成人精品一区| 日韩的一区二区| 欧美一区二区三区视频| 亚洲aaa精品| 一区二区在线免费| 亚洲素人一区二区| 久久精品在线观看| 国产mv日韩mv欧美| 成人一区在线看| 国产精品一卡二卡在线观看| 日本成人在线不卡视频| 美女精品在线观看| 国产精品二区影院| 国产伦视频一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 欧美性猛片xxxx免费看久爱| 久久久不卡网国产精品二区| 国产成人综合网| 国产成人一级电影| 久久―日本道色综合久久| 国产日韩欧美在线一区| 亚洲欧美一区二区三区极速播放| 国产日产欧美一区| 亚洲欧美网站| 亚洲av首页在线| 欧美亚洲丝袜| 久久观看最新视频| 一卡二卡三卡视频| 91黑丝在线| 最新中文在线视频| 男人的天堂在线视频免费观看 | 韩国av一区二区三区| 香蕉av一区二区| 伊人成人在线视频| 久久黄色影院| 国产成人在线看| 一本久久a久久免费精品不卡| 午夜影院欧美| 秋霞影院一区| 成人毛片在线| 日韩成人精品在线观看| 91理论电影在线观看| 91久久人澡人人添人人爽欧美| 亚洲精品一区二区三区婷婷月 | 日本不卡1234视频| 国产区一区二| 国产欧美精品久久| 国产精品人成在线观看免费| 成人性片免费| 国产毛片精品| 久久99精品国产麻豆婷婷洗澡| 一区二区三区日韩欧美精品| 日韩在线视频国产| 国内精品国语自产拍在线观看| 日本中文字幕高清| 亚洲成人激情社区| 欧美精品导航| 99re免费视频精品全部| 色综合中文字幕国产| 国产一区二区三区四区福利| 国产精品爽爽爽| 欧美国产视频一区| 国产美女在线观看| 欧美破处大片在线视频| 欧美午夜xxx| 国产一区国产精品| 永久免费av在线| 成人午夜国产| 亚洲天堂av一区| 亚洲视频999| 精品日本一线二线三线不卡| 国产精品美女www| 在线免费黄色毛片| 日韩视频一区| 中文字幕日韩欧美在线| 日本福利视频导航| 综合久久伊人| 亚洲福利视频三区| 99精品视频网站| 成人亚洲精品| 一区二区三区中文字幕精品精品 | 日日噜噜夜夜狠狠视频欧美人 | 成人看片网页| 8x8x8x视频在线观看| 中文字幕一区二区三区久久网站| 色婷婷av久久久久久久| 青青青在线观看视频| 一道本一区二区三区| 日韩欧美在线一区二区三区|