国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網(wǎng)站 > WEB開發(fā) > 正文

深入理解javascript原型和閉包(6)——繼承

2024-04-27 15:16:23
字體:
供稿:網(wǎng)友

原文地址:http://www.cnblogs.com/wangfupeng1988/p/3979985.html

為何用“繼承”為標題,而不用“原型鏈”?

原型鏈如果解釋清楚了很容易理解,不會與常用的java/C#產(chǎn)生混淆。而“繼承”確實常用面向?qū)ο笳Z言中最基本的概念,但是java中的繼承與javascript中的繼承又完全是兩回事兒。因此,這里把“繼承”著重拿出來,就為了體現(xiàn)這個不同。

 

Javascript中的繼承是通過原型鏈來體現(xiàn)的。先看幾句代碼

以上代碼中,f1是Foo函數(shù)new出來的對象,f1.a是f1對象的基本屬性,f1.b是怎么來的呢?——從Foo.PRototype得來,因為f1.__proto__指向的是Foo.prototype

訪問一個對象的屬性時,先在基本屬性中查找,如果沒有,再沿著__proto__這條鏈向上找,這就是原型鏈。

看圖說話:

上圖中,訪問f1.b時,f1的基本屬性中沒有b,于是沿著__proto__找到了Foo.prototype.b。

 

那么我們在實際應用中如何區(qū)分一個屬性到底是基本的還是從原型中找到的呢?大家可能都知道答案了——hasOwnProperty,特別是在for…in…循環(huán)中,一定要注意。

 

等等,不對! f1的這個hasOwnProperty方法是從哪里來的? f1本身沒有,F(xiàn)oo.prototype中也沒有,哪兒來的?

好問題。

它是從Object.prototype中來的,請看圖:

對象的原型鏈是沿著__proto__這條線走的,因此在查找f1.hasOwnProperty屬性時,就會順著原型鏈一直查找到Object.prototype。

 

由于所有的對象的原型鏈都會找到Object.prototype,因此所有的對象都會有Object.prototype的方法。這就是所謂的“繼承”。

當然這只是一個例子,你可以自定義函數(shù)和對象來實現(xiàn)自己的繼承。

 

說一個函數(shù)的例子吧。

我們都知道每個函數(shù)都有call,apply方法,都有l(wèi)ength,arguments,caller等屬性。為什么每個函數(shù)都有?這肯定是“繼承”的。函數(shù)由Function函數(shù)創(chuàng)建,因此繼承的Function.prototype中的方法。不信可以請微軟的Visual Studio老師給我們驗證一下:

看到了吧,有call、length等這些屬性。

那怎么還有hasOwnProperty呢?——那是Function.prototype繼承自O(shè)bject.prototype的方法。有疑問可以看看上一節(jié)講instanceof時候那個大圖,看看Function.prototype.__proto__是否指向Object.prototype。

 

原型、原型鏈,大家都明白了嗎?


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 治多县| 会理县| 商洛市| 舞阳县| 三河市| 肇东市| 罗平县| 城市| 安国市| 武山县| 波密县| 安溪县| 思南县| 开鲁县| 罗源县| 自治县| 荣昌县| 江达县| 尉犁县| 黎平县| 武宣县| 南通市| 长治市| 龙里县| 武平县| 普兰县| 辽阳市| 纳雍县| 蓝田县| 永济市| 邳州市| 诏安县| 抚远县| 武胜县| 玉屏| 阳东县| 分宜县| 平塘县| 榆中县| 陇西县| 崇仁县|