簡(jiǎn)單解析JavaScript中的__proto__屬性
JavaScript是一個(gè)面向?qū)ο笳Z(yǔ)音,即一切皆對(duì)象。
那么怎么生成對(duì)象?在Java的世界里,對(duì)象是由類(Class)實(shí)例出來(lái)的,通俗地說(shuō),就是將事物抽象成一個(gè)模具,用這個(gè)模具(類)生產(chǎn)出一個(gè)個(gè)具體的實(shí)物(對(duì)象)。
可是JS中沒(méi)有類這個(gè)概念,有的是“原型”,對(duì)象是由原型衍生出來(lái)的。通俗地說(shuō),在JS的世界里,“原型”并不是一個(gè)模具,而是一個(gè)具體的實(shí)物(對(duì)象)。所有對(duì)象都是由另一個(gè)對(duì)象衍生出來(lái)的,而這個(gè)被衍生的對(duì)象就是所謂的“原型對(duì)象”。
在javascript中有三類對(duì)象,1用戶創(chuàng)建的對(duì)象,2構(gòu)造函數(shù)的對(duì)象,3原型對(duì)象
- 用戶創(chuàng)建的對(duì)象,一般意義上使用new語(yǔ)句顯式構(gòu)造的方法。
- 構(gòu)造函數(shù)的對(duì)象,普通的構(gòu)造函數(shù),即通過(guò)new調(diào)用生成普通對(duì)象的函數(shù)
- 原型對(duì)象,構(gòu)造函數(shù)prototype屬性指向的對(duì)象。
這三個(gè)對(duì)象中每一個(gè)類都有一個(gè)屬性-__proto__屬性,它們指向該對(duì)象的原型,從任何對(duì)象沿用它開(kāi)始遍歷都可以追溯到Object.prototype。
構(gòu)造函數(shù)都有prototype對(duì)象,它指向一個(gè)原型對(duì)象,通過(guò)該構(gòu)造函數(shù)創(chuàng)建對(duì)象的時(shí)候,被創(chuàng)建的對(duì)象的__proto__屬性將指向構(gòu)造函數(shù)的prototype屬性。
原型對(duì)象有一個(gè)constructor屬性,該屬性指向它對(duì)應(yīng)的構(gòu)造函數(shù)。
Talk is cheap, show me the code! 咱們來(lái)看看代碼:
var obj = {}; console.log(obj);
咱們將__proto__展開(kāi)看看:是一些默認(rèn)方法。
你一定會(huì)發(fā)生這個(gè)__proto__對(duì)象中也有一個(gè)__proto__對(duì)象,正如我們剛才說(shuō)的,每個(gè)對(duì)象都有一個(gè)__proto__屬性指向它的原型對(duì)象。我們打印一下這個(gè)__proto__中的__proto__:
console.log(obj.__proto__.__proto__); //--> null
結(jié)果是null,說(shuō)明已經(jīng)到了頂層原型對(duì)象。obj是用大括號(hào){}定義的,obj的原型對(duì)象自然是JS的頂層對(duì)象。
咱們?cè)倏匆欢舜a,加強(qiáng)下理解:
var parent = { name : "parent" }; var child = { name : "child", __proto__ : parent }; var subChild = { name : "subChild", __proto__ : child } console.log(subChild);
- subChild.__proto__ --> child
- child.__proto__ --> parent
- parent.__proto__ --> 頂層原型對(duì)象
- js中繼承的幾種用法總結(jié)(apply,call,prototype)
- JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的區(qū)別和應(yīng)用場(chǎng)景簡(jiǎn)述
- JavaScript中的prototype使用說(shuō)明
- js中的hasOwnProperty和isPrototypeOf方法使用實(shí)例
- 不錯(cuò)的一篇關(guān)于javascript-prototype繼承
- js中prototype用法詳細(xì)介紹
- JavaScript prototype 使用介紹
- Javascript中Array.prototype.map()詳解
- JS面向?qū)ο?、prototype、call()、apply()
- 數(shù)據(jù)排序誰(shuí)最快(javascript中的Array.prototype.sort PK 快速排序)
- JavaScript isPrototypeOf和hasOwnProperty使用區(qū)別
- JS 面向?qū)ο笾衿娴膒rototype
相關(guān)文章
JavaScript中的setMilliseconds()方法使用詳解
這篇文章主要介紹了JavaScript中的setMilliseconds()方法使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06JavaScript中的勻速運(yùn)動(dòng)和變速(緩沖)運(yùn)動(dòng)詳細(xì)介紹
一個(gè)div的運(yùn)動(dòng)其實(shí)就是它與瀏覽器邊框的距離在變動(dòng)。如果他變化的速率一定,那就是勻速運(yùn)動(dòng);如果變化的速率不一定,那么就是變速運(yùn)動(dòng)2012-11-11actionscript與javascript的區(qū)別
actionscript是flash的腳本語(yǔ)言,目前已經(jīng)由adobe公司升級(jí)到3.0版本,成為了真正意義的oop語(yǔ)言,JavaScript是由netscape工程師設(shè)計(jì)完成的一門腳本語(yǔ)言,用于web開(kāi)發(fā)的前端腳本2011-05-05javascript實(shí)現(xiàn)playfair和hill密碼算法
這篇文章主要介紹了javascript實(shí)現(xiàn)playfair和hill密碼算法,需要的朋友可以參考下2014-12-12探討JavaScript中的Rest參數(shù)和參數(shù)默認(rèn)值
這篇文章的主要介紹了JavaScript中的Rest參數(shù)和參數(shù)默認(rèn)值,內(nèi)容很充實(shí),需要了解的朋友可以參考下2015-07-07可簡(jiǎn)單避免的三個(gè)JS發(fā)布錯(cuò)誤的詳細(xì)介紹
這篇文章詳細(xì)介紹了可簡(jiǎn)單避免的三個(gè)JS發(fā)布錯(cuò)誤,有需要的朋友可以參考一下2013-08-08JavaScript 遞增、遞減運(yùn)算符實(shí)例
遞增、遞減運(yùn)算符實(shí)例,基礎(chǔ)Js代碼范例,新手可參考哦。2010-07-07