摘要:對于中的引用類型而言,是保存著它們所有實例方法的真正所在。高級程序設計構造函數陌上寒原型對象有一個屬性,指向該原型對象對應的構造函數為什么有屬性那是因為是的實例。
溫故
我們先回顧一下前兩天討論的內容
創建對象的三種方式通過對象直接量
通過new創建對象
通過Object.create()
js中對象分為兩種函數對象
普通對象
原型對象prototype每一個函數對象都有一個prototype屬性,但是普通對象是沒有的;
普通對象都是通過函數創建的
在 ECMAScript 核心所定義的全部屬性中,最耐人尋味的就要數 prototype 屬性了。對于 ECMAScript 中的引用類型而言,prototype 是保存著它們所有實例方法的真正所在。換句話所說,諸如 toString()和 valuseOf() 等方法實際上都保存在 prototype 名下,只不過是通過各自對象的實例訪問罷了。----《JavaScript 高級程序設計》構造函數constructor
function Foo(name) { this.name = name; } var foo = new Foo("陌上寒"); console.log(Foo.prototype.constructor===Foo)//true console.log(foo.constructor===Foo);//true
原型對象有一個constructor屬性,指向該原型對象對應的構造函數
foo 為什么有 constructor 屬性?那是因為 foo 是 Foo 的實例。
那 Foo.prototype 為什么有 constructor 屬性??同理, Foo.prototype Foo 的實例。
也就是在 Foo 創建的時候,創建了一個它的實例對象并賦值給它的 prototype
在Firefox、Safari 和 Chrome 的每個對象上都有這個__proto__,屬性 ,而在其他瀏覽器中是完全不可見的為了確保瀏覽器兼容性問題,不要直接使用 proto 屬性)
// 普通對象的\__proto\__指向當前函數對象的原型, console.log("陌上寒".__proto__===String.prototype);//true //原型對象(也屬于普通對象)的__proto__指向當前函數對象的原型 console.log(String.prototype.__proto__===Object.prototype);//true //內置函數對象的\__proto\__指向的都是? () { [native code] } console.log(Object.__proto__);//? () { [native code] } //Object的原型對象的\__proto\__為null console.log(Object.prototype.__proto__)//null
普通對象的__proto__指向當前函數對象的原型,
原型對象(也屬于普通對象)的__proto__指向當前函數對象的原型
內置函數對象的__proto__指向的都是? () { [native code] }
所有對象(除了Object.prototype)都存在_proto_
Object的原型對象的__proto__為null
好好消化上面的知識點,有助于我么討論新的內容==>原型鏈
知新 原型鏈原型對象prototype
構造函數constructor
隱式原型_proto_
通過三者之間的聯系,形成了原型鏈
繼續看一下我門昨天討論過的代碼
console.log("陌上寒".__proto__===String.prototype);//true console.log(String.prototype.__proto__===Object.prototype);//true //等量代換,得出以下結論 console.log("陌上寒".__proto__.__proto__===Object.prototype);//true
我們剛才說過,普通對象的__proto__指向當前函數對象的原型
我們剛才還說過,普通對象都是通過函數創建的
根據以上兩個結論我們分析一下上面的代碼
‘陌上寒’是字符串類型,’陌上寒’的構造函數是String(), 所以’陌上寒’的__proto__指向String的原型
String是js的內置構造函數,內置構造函數繼承自Object
String的原型對象String.prototype也是一個普通對象,它的__proto__指向Object的原型,即Object.prototype
所以
console.log("陌上寒".__proto__.__proto__===Object.prototype);//true
這就是原型鏈
我們繼續品讀以下代碼
//我們創建一個構造函數Foo(要記得,構造函數命名,首字母要大寫) function Foo() {} //通過我們自定義的構造函數。通過new操作符,我們實例化出來一個對象foo const foo = new Foo() //對象的__proto__指向當前函數對象(foo是同構Foo實例化出來的,所以foo的函數對象是Foo)的原型 console.log(foo.__proto__===Foo.prototype); //原型對象也存在__proto__,指向該原型對象(Foo.prototype)所對應的函數對象(Object)的原型(好像有點繞,看代碼就沒那么繞了) console.log(Foo.prototype.__proto__===Object.prototype);//true //上面的如果懂了,這行代碼就簡單了,一個數學的等量代換,就得出了結論 console.log(foo.__proto__.__proto__===Object.prototype);//true console.log("---我是分割線----"); //我們通過字面量創建了一個對象,等同于 const obj = new Object() const obj = {} //obj 是通過內置構造函數Object創建的,所以,obj的__proto__指向它的函數對象(Object)的原型(prototype)即:Object.prototype console.log(obj.__proto__===Object.prototype);//true console.log("---我是分割線----");//true //創建一個對象b const b = {} //我們之前說過創建對象有三種方式,我們使用第三種方式創建一個對象b1,對象b1繼承自對象b,也就是說,對象b是對象b1的__proto__ const b1 = Object.create(b) //對象b是對象b1的__proto__ console.log(b1.__proto__===b);//true //前面已經證實過,b.__proto__==Object.prototype,不再贅述 console.log(b.__proto__==Object.prototype);//true //等量代換就得出以下結論 console.log(b1.__proto__.__proto__===b.__proto__);//true console.log(b1.__proto__.__proto__==Object.prototype);//true
我偷了一張圖
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98989.html
摘要:要用作原型的對象。函數對象可以創建普通對象,這個我們上面講過了回顧一下這是一個自定義構造函數普通對象沒法創建函數對象,凡是通過創建的對象都是函數對象,其他都是普通對象通常通過創建,可以通過來判斷。 關于js的原型和原型鏈,有人覺得這是很頭疼的一塊知識點,其實不然,它很基礎,不信,往下看要了解原型和原型鏈,我們得先從對象說起 創建對象 創建對象的三種方式: 對象直接量 通過對象直接量創建...
摘要:原文鏈接關于的原型和原型鏈,看我就夠了一參考鏈接闖關記之原型及原型鏈之原型與原型鏈一篇文章帶你理解原型和原型鏈徹底理解原型鏈一的默認指向圖解和的三角關系原型和原型鏈三張圖搞懂的原型對象與原型鏈 溫故 創建對象的三種方式 通過對象直接量 通過new創建對象 通過Object.create() js中對象分為兩種 函數對象 普通對象 仔細觀察如下代碼 function Foo(na...
摘要:基本概念方法會返回一個布爾值,指示對象自身屬性中非繼承屬性是否具有指定的屬性,如果具有帶指定名稱的屬性,則方法返回,否則返回。此方法不會檢查對象原型鏈中的屬性該屬性必須是對象本身的一個成員。使用語法參數,必需。 hasOwnProperty基本概念 hasOwnProperty() 方法會返回一個布爾值,指示對象自身屬性中(非繼承屬性)是否具有指定的屬性,如果 object 具有帶指定...
摘要:也就是說,所有的函數和構造函數都是由生成,包括本身。如果只考慮構造函數和及其關聯的原型對象,在不解決懸念的情況下,圖形是這樣的可以看到,每一個構造函數和它關聯的原型對象構成一個環,而且每一個構造函數的屬性無所指。 前言 JavaScript 是我接觸到的第二門編程語言,第一門是 C 語言。然后才是 C++、Java 還有其它一些什么。所以我對 JavaScript 是非常有感情的,畢...
閱讀 3120·2023-04-25 15:02
閱讀 2818·2021-11-23 09:51
閱讀 2034·2021-09-27 13:47
閱讀 1992·2021-09-13 10:33
閱讀 973·2019-08-30 15:54
閱讀 2645·2019-08-30 15:53
閱讀 2860·2019-08-29 13:58
閱讀 892·2019-08-29 13:54