Object.prototype 原型和原型鏈

Object.prototype 原型和原型鏈

原型

Javascript中所有的對象都是Object的實例,并繼承Object.prototype的屬性和方法,有些屬性是隱藏的。換句話說,在對象創建時會存在預定義的屬性,其中有一個屬性就是原型對象。在函數對象中存在原型對象prototype,在普通對象中沒有prototype,但存在__proto__。或者說使用function定義的對象與使用new操作符生成的對象之間有一個重要的區別,這個區別就是function定義的對象有一個prototype屬性,使用new生成的對象就沒有這個prototype屬性,存在__proto__

var o =new Object();    
console.log(o.__proto__);
console.log(o.prototype);//undefinedvar fn = function(){} 
console.log(fn.prototype);//Object {constructor: function}
var f1 = new fn();
console.log(f1.__proto__);
console.log(f1.__proto__===fn.prototype);//true

原型鏈

那么__proto__是什么?每個對象都會在其內部初始化一個屬性,就是__proto__
普通對象中的__proto__是什么呢? Object的本質函數對象,是通過new Function()創建,所以Object.__proto__指向Function.prototype。同理,Function也是函數對象,因此Function.__proto__同樣指向Function.prototypeObject.prototype對象也有__proto__屬性,但它比較特殊,為null。這個由__proto__串起來的直到Object.prototype.__proto__為null的鏈就是原型鏈。

console.log(Object.__proto__ === Function.prototype);//true
console.log(Function.__proto__===Function.prototype);//true
console.log(Object.prototype.__proto__);//null

當我們訪問一個對象的屬性 時,如果這個對象內部不存在這個屬性,那么他就會去__proto__里找這個屬性,這個__proto__又會有自己的__proto__,于是就這樣 一直找下去,也就是我們平時所說的原型鏈的概念。參考下面的例子:

var Fn = function(){};
Fn.prototype.Hello = function(){console.log("Hello World");}
var f1 = new Fn();
f1.Hello();//Hello World

首先var f1=new fn(),f1是Fn的實例,可以得出f1.__proto__=Fn.prototype。當我們調用f1.hello()時,首先f1中沒有Hello這個屬性,于是,它會到他的__proto__中去找,也就是Fn.prototype,而我們在上面定義了 Fn.prototype.Hello=function(){}; 于是,就找到了對應的方法。
從一個更復雜的例子中看原型鏈的原理:

var Person = function() {};
Person.prototype.Name = function() {console.log("person name");
}
Person.prototype.Sex = "male or female";var Younger = function() {};
Younger.prototype = new Person();
Younger.prototype.Age = function() {console.log("14-28")
};
Younger.prototype.Sex = "female";var Ann = new Younger();
Ann.Name(); //person name
console.log(Ann.Age()); //14-28
console.log(Ann.Sex); //female

對上述代碼,我們可以進行如下分析:
var Younger = function() {}===>:Younger.__proto__=Person.prototype,
Younger.prototype = new Person()===>:Younger.prototype.__proto__ = Person.prototype,
var Ann = new Younger()===>Ann.__proto__=Younger.prototype,
綜上可得:
Ann.__proto__.__proto__ = Person.prototype

Ann本身沒有Name()方法,于是從Ann.__proto__(Younger.prototype)中找,仍沒有找到于是在向上一層Ann.__proto__.__proto__(Person.prototype)中尋找,最終在Person.prototype中找到對應的方法并調用。
同理,Ann本身并沒有Age()方法,但在Ann.__proto__(Younger.prototype)存在。
對于Ann.Sex,在Ann.__proto__(Younger.prototype)中已經能夠找到,便不再向上尋找,因此輸出是female

轉載于:https://www.cnblogs.com/Nancy-wang/p/6903221.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/392646.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/392646.shtml
英文地址,請注明出處:http://en.pswp.cn/news/392646.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

leetcode 406. 根據身高重建隊列(貪心算法)

假設有打亂順序的一群人站成一個隊列。 每個人由一個整數對 (h, k) 表示,其中 h 是這個人的身高,k 是應該排在這個人前面且身高大于或等于 h 的人數。 例如:[5,2] 表示前面應該有 2 個身高大于等于 5 的人,而 [5,0] 表示前面不應該…

java和vue2.0

java中的el表達式${對象.屬性}和vue中的雙向數據綁定{{mode.xx}}感覺有點類似轉載于:https://www.cnblogs.com/YangBinChina/p/11180460.html

oh-my-zsh官方教程

https://github.com/robbyrussell/oh-my-zsh/wiki

leetcode 134. 加油站

在一條環路上有 N 個加油站,其中第 i 個加油站有汽油 gas[i] 升。 你有一輛油箱容量無限的的汽車,從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發,開始時油箱為空。 如果你可以繞環路行駛一周&#…

ps怎么對比原圖快捷鍵_PS學習之旅:ps如何制作滿天星,讓你夜晚的天空圖片更美...

ps學習之旅,本文介紹關于如何利用ps軟件來制作滿天星,讓你夜晚的天空圖片更美,操作很簡單哦。1工具/原料Adobe Photoshop CS6軟件圖片一張2效果展示原圖:效果圖:3方法/步驟(1)打開PS,選擇你想要加星星的一張…

linux程序莫名異常怎么查

內存異常經常導致程序出現莫名其妙的錯誤,往往很難查證,本文介紹在linux下的各種常見內存異常的查證工具和方法。1 訪問空指針/未初始化指針/重復釋放內存對于像訪問空指針、未初始化指針(非法地址),重復釋放內存等內存…

永磁直驅風力發電機結構圖_國內首臺10MW海上永磁直驅風力發電機研制成功

2019首屆新能源產業投融資論壇2019年10月25日周老師:157129595968月21日,具有完全自主知識產權、國內首臺10MW海上永磁直驅風力發電機在東方電氣集團東方電機有限公司研制成功,以此優異成績向新中國成立70周年獻禮。10MW海上永磁直驅風力發電…

struts2官方 中文教程 系列六:表單驗證

先貼個本帖的地址,以免被爬:struts2教程 官方系列六:表單驗證 即 http://www.cnblogs.com/linghaoxinpian/p/6906720.html 下載本章節代碼 介紹 在本教程中,我們將探索使用Struts2來驗證用戶在表單上的輸入。有兩種方法可以來進…

Alictf 2015決賽題目設計和解題思路

解題思路: https://weibo.com/p/1001603836186467681086 設計題目: http://www.cnblogs.com/qsjmobilesec/p/4456090.html

【轉載】 華為榮耀手機如何進入開發者模式

針對手機APP開發人員來說,很多時候開發手機APP應用的時候,需要進入手機的開發者模式中對程序進行調試等操作,此文將介紹華為榮耀手機如何進入開發者模式,以華為榮耀V9手機為例,華為榮耀V10、榮耀V20、華為P20、華為P30…

c++ dll 類使用_在.Net Core 中使用鉤子

目錄前言什么是鉤子使用鉤子3. 掛載多個鉤子4. 在鉤子中加載額外的程序集5. 在 Asp.Net Web Api 項目中使用鉤子結束語演示代碼下載前言Host startup hook,是2.2中提供的一項新的功能,通過使用主機啟動鉤子,允許開發人員在不修改代碼的情況下…

3c技能和背包需要改建嗎?_認為您需要儀表板? 您應該改建一個筆記本。

3c技能和背包需要改建嗎?by Mahdi Karabiben通過Mahdi Karabiben 認為您需要儀表板? 您應該改建一個筆記本。 (Think you need a Dashboard? You should build a Notebook instead.) After first establishing themselves as a key component of the standard Bu…

leetcode 147. 對鏈表進行插入排序

對鏈表進行插入排序。 插入排序的動畫演示如上。從第一個元素開始,該鏈表可以被認為已經部分排序(用黑色表示)。 每次迭代時,從輸入數據中移除一個元素(用紅色表示),并原地將其插入到已排好序的…

JSP過濾器Filter配置過濾類型匯總

一、配置方法1 映射過濾應用程序中所有資源<filter> <filter-name>loggerfilter</filter-name> <filter-class>myfilter.LoggerFilter</filter-class></filter><filter-mapping> <filter-name>loggerfilter</filt…

ERP流程入門_從會計分錄理解企業基本流程[轉]

ERP流程入門_從會計分錄理解企業基本流程 本貼寫給尚未在企業工作過的朋友&#xff01;了解企業的基本流程的一個方法是看它的會計分錄,我們現在來看一個完整的企業基本流程&#xff0c;它的會計分錄是如何做的&#xff0c;其中有些帳戶名稱可能不一樣&#xff0c;不過沒關系&a…

薩默爾機器人_助力產業發展 西安市人工智能機器人學會正式成立

8月23日&#xff0c;西安市人工智能機器人學會在西咸新區灃東新城協同創新港正式成立。西安報業全媒體記者 馮煒 攝8月23日&#xff0c;西安市人工智能機器人學會正式成立。學會將通過市場化機制、社會化服務等方式&#xff0c;整合科技創新資源和人才培養資源&#xff0c;促進…

粒度過粗_這些書幫助我度過了第一次成為技術主管的經歷

粒度過粗by Danny Perez丹尼佩雷斯(Danny Perez) 這些書幫助我度過了第一次成為技術主管的經歷 (These books helped me navigate my first time being a tech lead) The tech lead was moving to another team for a long-term assignment, and I took over as the engineeri…

隨便說說:在ASP.NET應用程序中上傳文件

在Web程序中上傳文件是很常見的需求。利用HTTP協議上傳文件的方式非常有限&#xff0c;最常見的莫過于使用<input type"file" />元素進行上傳。這種上傳方式會將內容使用multipart/form-data方案進行編碼&#xff0c;并將內容POST到服務器端。使用multipart/fo…

leetcode 148. 排序鏈表(歸并排序)

給你鏈表的頭結點 head &#xff0c;請將其按 升序 排列并返回 排序后的鏈表 。 進階&#xff1a; 你可以在 O(n log n) 時間復雜度和常數級空間復雜度下&#xff0c;對鏈表進行排序嗎&#xff1f; 示例 1&#xff1a; 輸入&#xff1a;head [4,2,1,3] 輸出&#xff1a;[1…

理論與哲學就是梳理無限感性經驗和知性知識的工具

理論與哲學就是梳理無限感性經驗和知性知識的工具&#xff0c; 是因為人腦的特性&#xff0c;或者說人腦功能的局限性而被人創造出來的思想工具。 工具服務于實踐&#xff0c;并被實踐所檢驗&#xff08;描述、解釋、預見&#xff09;。 工具一旦創建就有其客觀性&#xff0c;但…