<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
首先我們先記住幾個知識點:
prototype
屬性__proto__
屬性(null除外)首先我們通過下面的例子瞭解些基本的概念
function Person() { } var person1 = new Person()
function Person() { } Person.prototype.name = 'Person' var person1 = new Person() console.log(person1.name) // Person console.log(Person.prototype)
prototype
屬性指向的是 Person.prototype
的原型物件prototype
的 nameperson1
和Person
關聯起來,使得person1可以存取到Person中prototype的屬性值帶著上面的疑問我們繼續下面的例子
__proto__
和prototype
的關係
function Person() { } Person.prototype.name = 'Person' var person1 = new Person() console.log(person1) console.log(person1.__proto__.name === Person.prototype.name) // true console.log(person1.__proto__ === Person.prototype) // true
一開始我們就提到,每個物件都有一個__proto__
屬性(null除外),通過這個例子我們發現person1的__proto__屬性下有個name屬性,正好是Person.prototype.name
的值,由此我們可以看出範例person1是通過__proto__存取的建構函式Person的prototype屬性
根據上面的結論,我們很容易得出以下關係圖
由此我們很容易得出,多個範例物件之間通過__proto__
進行關聯,可以通過__proto__
共用Person.prototype上的屬性
既然建構函式和範例都可以指向原型,那麼原型是否有屬性指向建構函式或者範例呢? 通過上面的例子,我們發現除了__proto__
,還有一個constructor
屬性
function Person() { } Person.prototype.name = 'Person' var person1 = new Person() console.log(Person) // ƒ Person() {} console.log(Person.prototype.constructor) // ƒ Person() {} console.log(person1.__proto__.constructor) // ƒ Person() {} // 由此我們發現`constructor`屬性指向的是Person建構函式本身,不難得出以下結論 console.log(Person === Person.prototype.constructor) // true
由此我們可以得出以下關係圖:
__proto__
屬性(null除外),因此原型物件也是有__proto__
的var prototypeObj = new Object() console.log(prototypeObj.__proto__ === Object.prototype) // true
到此我們可以得出一個新的關係圖
到這裡大家可能就有疑惑了,這樣不就無限迴圈了嗎,Object.protoType
的__proto__
又是什麼呢?
console.log(Object.protoType.__proto__) // null console.log(Object.protoType.__proto__ === null) // true
所以 Object.prototype 為null,屬性查詢到這裡也就結束了
由上面的例子我們得知,在查詢物件的屬性時,優先查詢範例物件的屬性,查詢不到時就會通過__proto__
查詢 prototype
原型物件的屬性,還查不到會通過prototype的__proto__
繼續查詢,直到Object.protoType.__proto__
為止
圖中由__proto__
組成的紅色鏈路就是我們所說的原型鏈
關於 Object 和 Function
既然函數也是物件,物件都有 __proto__
,那麼 Object
和 Function
的 __proto__
屬性又是什麼呢?
Function.prototype
是由Object建構函式建立的根據原型鏈的相關知識,範例物件的 __proto__
指向建構函式的原型物件 prototype
// Object物件由Function建構函式建立 Object.__proto__ === Function.prototype // true // Function的原型物件`Function.prototype`是由Object建立 Function.prototype.__proto__ === Object.prototype // true // Function由Function本身建立(按照原型的定義可以簡單這麼去理解,這裡不做深究) Function.__proto__ === Function.prototype // true Object.getPrototypeOf(Function) === Function.prototype // true
由此我們可以得出最終的關係圖:
關於 getPrototypeOf
、isPrototypeOf
、instanceof
function Person() { } var person1 = new Person() // Object.getPrototypeOf(obj) 返回obj範例物件的原型(obj.__proto__) console.log(Object.getPrototypeOf(person1) === Person.prototype) // true // Object.isPrototypeOf(obj),如果obj.__proto__和Object.prototype在一條原型鏈上(或者理解為Object為obj的建構函式或父級建構函式),則返回true console.log(Object.prototype.isPrototypeOf(person1)) // true console.log(Object.prototype.isPrototypeOf(Person.prototype)) // true console.log(Person.prototype.isPrototypeOf(person1)) // true // (obj instanceof Object) 同isPrototypeOf類似,obj.__proto__和Object.prototype在一條原型鏈上,則返回true console.log(person1 instanceof Person) // true console.log(person1 instanceof Object) // true
prototype
屬性,值是一個原型物件__proto__
屬性(null除外),指向建構函式的原型prototype
constructor
指向建構函式本身Object
建構函式範例化產生的,所以原型物件的__proto__
指向Object的原型物件Object.prototype
Object
建構函式的原型物件為nullfunction Person() {} var person = new Person() console.log(person.__proto__ === Person.prototype) // true console.log(Person === Person.prototype.constructor) // true console.log(Object.prototype.__proto__ === null) // true // 推導person.constructor等於person.__proto__.constructor等於Person.prototype.constructor console.log(person.constructor === Person.prototype.constructor) // true
到此這篇關於JavaScript深入淺出__proto__和prototype的文章就介紹到這了,更多相關JS proto 和 prototype內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45