摘要:又是一個比較重要的知識點原型。且和指向了同一個對象。可以是使用做什么創建對象的數據共享把一些實例共享的屬性和方法放在原型上,節約空間。基于原型鏈的委托繼承這個原型繼承的關系可以用圖來表示參考資料深入之從原型到原型鏈強大的原型和原型鏈
又是一個比較重要的知識點——原型(prototype)。
一個例子function F() {} var f = new F() F.prototype // {constructor: ?} f.__proto__ // {constructor: ?} F.prototype === f.__proto__ // true F.prototype.constructor === F // true
可以看到F函數有一個屬性prototype指向了一個對象{constructor: ?},由F函數new出來的對象f有一個屬性__proto__指向一個對象{constructor: ?}。且f.__proto__和F.prototype指向了同一個對象。F.prototype有一個constructor屬性又指回了F本身。
總結一下即是:
prototype:JavaScript中每個函數都有一個prototype屬性,此屬性指向了該函數的原型對象
__proto__:JavaScript中每一個對象(null除外),包括函數創建的對象、函數自身、原型對象,都有一個__proto__屬性,指向了創建該對象的函數的原型
constructor:該屬性屬于原型對象,指向相關的構造函數
繼續探究既然剛剛說了每一個對象包括原型對象都有__proto__屬性,那么繼續來試驗:
// 接上一段代碼 F.__proto // ? () { [native code] } F.prototype.__proto__ // {constructor: ?, __defineGetter__: ?, __defineSetter__: ?, hasOwnProperty: ?, __lookupGetter__: ?,?…} F.__proto__ === Function.prototype // true F.prototype.__proto__ === Object.prototype // true
首先,F作為一個函數的同時它也是對象,所以它擁有屬性__proto__指向了Function.prototype,因為所有的函數都可以理解為Function的實例;同樣的,F.prototype作為一個對象,它的__proto__指向Object.prototype,因為它是對象且沒有指明的構造函數,所以它直接是Object函數生成的實例,自然__proto__就指向Object.prototype。
現在再來探究一下Object.prototype作為一個對象,它的__proto__又指向了什么呢?
Object.prototype .__proto__ // null
Object.prototype.__proto__指向了null,這也說明了null是原型鏈的頂端。
上述的所有指向關系可以用一張圖來表示:
ps:這里面有一個細節,Function.__proto__ === Function.prototype
Function作為方法,它有自己的prototype;Function作為對象,它的__proto__指向了Function.prototype,這似乎是在說:Function方法生成了Function對象?
針對這個問題,我覺得還是看這篇文章比較合適,我就不費口舌了。
創建對象的數據共享
function Person(){} Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); //"Nicholas" var person2 = new Person(); person2.sayName(); //"Nicholas" alert(person1.sayName == person2.sayName); //true
把一些實例共享的屬性和方法放在原型上,節約空間。
基于原型鏈的委托繼承function Child(){} function Parent(){ this.name = "ppp" } Child.prototype = new Parent() var c = new Child() c.name // "ppp"
這個原型繼承的關系可以用圖來表示:
參考資料:
JavaScript深入之從原型到原型鏈
強大的原型和原型鏈
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/95223.html
摘要:之前總結了的一些常見綁定情況前端工程師手冊之的筆記,但是還有一些沒有說到,今天繼續學習一下。參考資料箭頭函數你不知道的上卷 之前總結了this的一些常見綁定情況(【前端工程師手冊】JavaScript之this的筆記),但是還有一些沒有說到,今天繼續學習一下。 es6箭頭函數 先說結論:箭頭函數沒有自己的this,它是根據外層(函數或者全局,后面會說到箭頭函數作為某個對象的方法時的情況...
摘要:函數別名是全局對象的屬性顯式綁定一個小栗子和第一個參數是一個對象,它們會把這個對象綁定到,接著在調用函數時指定這個。 今天總結一下this。 誤解 熟悉Java或者其他語言的同學看到this會想當然的認為this指向函數本身,然而在JavaScript中并不是這樣子。 function func(){ console.log(this.index) } func.index ...
摘要:本文最早為雙十一而作,原標題雙大前端工程師讀書清單,以付費的形式發布在上。發布完本次預告后,捕捉到了一個友善的吐槽讀書清單也要收費。這本書便從的異步編程講起,幫助我們設計快速響應的網絡應用,而非簡單的頁面。 本文最早為雙十一而作,原標題雙 11 大前端工程師讀書清單,以付費的形式發布在 GitChat 上。發布之后在讀者圈群聊中和讀者進行了深入的交流,現免費分享到這里,不足之處歡迎指教...
摘要:本文最早為雙十一而作,原標題雙大前端工程師讀書清單,以付費的形式發布在上。發布完本次預告后,捕捉到了一個友善的吐槽讀書清單也要收費。這本書便從的異步編程講起,幫助我們設計快速響應的網絡應用,而非簡單的頁面。 本文最早為雙十一而作,原標題雙 11 大前端工程師讀書清單,以付費的形式發布在 GitChat 上。發布之后在讀者圈群聊中和讀者進行了深入的交流,現免費分享到這里,不足之處歡迎指教...
閱讀 2947·2021-09-23 11:32
閱讀 2918·2021-09-22 15:12
閱讀 1708·2019-08-30 14:07
閱讀 3448·2019-08-29 16:59
閱讀 1640·2019-08-29 11:11
閱讀 2307·2019-08-26 13:50
閱讀 2426·2019-08-26 13:49
閱讀 2621·2019-08-26 11:49