摘要:要用作原型的對(duì)象。函數(shù)對(duì)象可以創(chuàng)建普通對(duì)象,這個(gè)我們上面講過(guò)了回顧一下這是一個(gè)自定義構(gòu)造函數(shù)普通對(duì)象沒(méi)法創(chuàng)建函數(shù)對(duì)象,凡是通過(guò)創(chuàng)建的對(duì)象都是函數(shù)對(duì)象,其他都是普通對(duì)象通常通過(guò)創(chuàng)建,可以通過(guò)來(lái)判斷。
關(guān)于js的原型和原型鏈,有人覺(jué)得這是很頭疼的一塊知識(shí)點(diǎn),其實(shí)不然,它很基礎(chǔ),不信,往下看
要了解原型和原型鏈,我們得先從對(duì)象說(shuō)起
創(chuàng)建對(duì)象的三種方式:
對(duì)象直接量通過(guò)對(duì)象直接量創(chuàng)建對(duì)象,這是最簡(jiǎn)單也是最常用的創(chuàng)建對(duì)象的方式
var empty = {}; var pos = {x:12,y:23}; var pos2 = {x:pos.x,y:pos.y+1}; var author={ "my name":"陌上寒",//屬性名帶空格,必須用引號(hào)包裹 "article-title":"關(guān)于javascript的原型和原型鏈,看我就夠了(一)",//屬性名帶連字符,必須用引號(hào)包裹 "if":"使用保留字作為屬性名,必須用引號(hào)包裹"http://使用保留字作為屬性名,必須用引號(hào)包裹 }通過(guò)new創(chuàng)建對(duì)象
通過(guò)new運(yùn)算符創(chuàng)建并初始化一個(gè)新對(duì)象,關(guān)鍵字new后跟隨一個(gè)函數(shù)調(diào)用,這個(gè)函數(shù)成為構(gòu)造函數(shù)(constructor),構(gòu)造函數(shù)用來(lái)初始化一個(gè)新對(duì)象,js包含了一些內(nèi)置的構(gòu)造函數(shù)
var obj = new Object()//創(chuàng)建一個(gè)空對(duì)象等同于 var obj = {} var arr = new Array()//創(chuàng)建一個(gè)空數(shù)組等同于 var arr = [] ...
上面的Object(),Array(),都是js內(nèi)置的構(gòu)造函數(shù)
除了內(nèi)置的構(gòu)造函數(shù),我們還可以使用自定義構(gòu)造函數(shù)來(lái)初始化對(duì)象
function fun(){ console.log("這是一個(gè)自定義構(gòu)造函數(shù)") }; var myObj= new fun();Object.create()
這個(gè)創(chuàng)建對(duì)象的方法似乎有些陌生,它創(chuàng)建一個(gè)新對(duì)象,包含兩個(gè)參數(shù),
第一個(gè),必需。 要用作原型的對(duì)象。 可以為 null
第二個(gè),可選。 包含一個(gè)或多個(gè)屬性描述符的 JavaScript 對(duì)象
const obj = Object.create({x:1})//obj 繼承了屬性x const obj2 = Object.create(Object.prototype, { foo: { writable: true, configurable: true, value: "hello" } }) console.log(obj2);//輸出{foo: "hello"} const obj3 = Object.create(null)//obj3不繼承任何屬性和方法
創(chuàng)建一個(gè)空對(duì)象
//以下三種方法等效 var obj1 = {}; var obj2 = new Object() var obj3 = Object.create(Object.prototype)
今天重點(diǎn)說(shuō)原型,明天我們?cè)侔袿bject.create()展開(kāi)講述
簡(jiǎn)單回顧以下,以上就是創(chuàng)建對(duì)象的三種方式
通過(guò)對(duì)象直接量
通過(guò)new創(chuàng)建對(duì)象
通過(guò)Object.create()
馬上進(jìn)入正題了,還差一點(diǎn)點(diǎn)
我們都知道 JavaScript中萬(wàn)物皆對(duì)象,但對(duì)象之間也是有區(qū)別的。分為函數(shù)對(duì)象和普通對(duì)象。
函數(shù)對(duì)象可以創(chuàng)建普通對(duì)象,(這個(gè)我們上面講過(guò)了),回顧一下
function fun(){ console.log("這是一個(gè)自定義構(gòu)造函數(shù)") }; var myObj= new fun();
普通對(duì)象沒(méi)法創(chuàng)建函數(shù)對(duì)象,凡是通過(guò)new Function創(chuàng)建的對(duì)象都是函數(shù)對(duì)象,其他都是普通對(duì)象(通常通過(guò)Object創(chuàng)建),可以通過(guò)typeof來(lái)判斷。
function f1(){}; typeof f1 //"function" var o1 = new f1(); typeof o1 //"object" var o2 = {}; typeof o2 //"object"
關(guān)于函數(shù)的創(chuàng)建,注意以下寫(xiě)法等價(jià)
function f1(){} 等價(jià)于 var f1 = new Function(); function f21(a,b){ alert(a+b); } f21(1,2) 等價(jià)于 var f22 = new Function("a","b","alert(a+b)"); f22(1,2)
簡(jiǎn)單回顧一下
我們將對(duì)象分為函數(shù)對(duì)象和普通對(duì)象,函數(shù)對(duì)象的級(jí)別要要高于普通對(duì)象,可以通過(guò)函數(shù)對(duì)象創(chuàng)建普通對(duì)象,但是無(wú)法通過(guò)普通對(duì)象創(chuàng)建函數(shù)對(duì)象
好了,進(jìn)入正題!
每一個(gè)js對(duì)象(null除外)都和另一個(gè)對(duì)象相關(guān)聯(lián),“另一個(gè)”對(duì)象就是原型,每一個(gè)對(duì)象都從原型繼承屬性
所有通過(guò)對(duì)象直接量創(chuàng)建的對(duì)象都具有同一個(gè)原型對(duì)象,可以通過(guò)Object.prototype獲取對(duì)原型對(duì)象的引用,注意以下代碼
//dmeo1 const obj =new Object() //等價(jià)于 const obj ={} //等價(jià)于const obj = Object.create() alert(obj.prototype)//undefined alert(Object.prototype)//[object Object] //demo2 function fun(){ console.log("這是一個(gè)自定義構(gòu)造函數(shù)") }; alert(fun.prototype)//[object Object]
看以上代碼,obj 為普通對(duì)象,obj的prototype為undefined,Object為js內(nèi)置構(gòu)造函數(shù),Object存在prototype
我們得出以下結(jié)論
每一個(gè)函數(shù)對(duì)象都有一個(gè)prototype屬性,但是普通對(duì)象是沒(méi)有的;
換個(gè)方式再說(shuō)一遍,只有函數(shù)對(duì)象才會(huì)存在prototype屬性,普通的對(duì)象不存在
還沒(méi)結(jié)束,看如下代碼
function fun(){ console.log("這是一個(gè)自定義構(gòu)造函數(shù)") }; console.log(fun.prototype)
輸出:
const obj = {} console.log(obj.__proto__);
輸出
const str="陌上寒" console.log(num.__proto__);
輸出
是構(gòu)造函數(shù)創(chuàng)建的實(shí)例的屬性,該屬性的作用是指向創(chuàng)建當(dāng)前對(duì)象的構(gòu)造函數(shù)。(這個(gè)不是我們今天重點(diǎn)要介紹的)
_proto_這是什么?根據(jù)我們的console.log,不難發(fā)現(xiàn),函數(shù)對(duì)象,普通對(duì)象,都存在__proto__,這是什么呢?__proto__和原型鏈有什么聯(lián)系呢?__proto__指向誰(shuí)呢?
我們明天繼續(xù)探討js原型和原型鏈,不見(jiàn)不散
原文鏈接
參考鏈接
簡(jiǎn)單理解js的prototype屬性
基于js中的原型(全面講解)
JS原型與原型鏈的深入理解
三張圖搞懂JavaScript的原型對(duì)象與原型鏈
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98963.html
摘要:原文鏈接關(guān)于的原型和原型鏈,看我就夠了一參考鏈接闖關(guān)記之原型及原型鏈之原型與原型鏈一篇文章帶你理解原型和原型鏈徹底理解原型鏈一的默認(rèn)指向圖解和的三角關(guān)系原型和原型鏈三張圖搞懂的原型對(duì)象與原型鏈 溫故 創(chuàng)建對(duì)象的三種方式 通過(guò)對(duì)象直接量 通過(guò)new創(chuàng)建對(duì)象 通過(guò)Object.create() js中對(duì)象分為兩種 函數(shù)對(duì)象 普通對(duì)象 仔細(xì)觀察如下代碼 function Foo(na...
摘要:對(duì)于中的引用類(lèi)型而言,是保存著它們所有實(shí)例方法的真正所在。高級(jí)程序設(shè)計(jì)構(gòu)造函數(shù)陌上寒原型對(duì)象有一個(gè)屬性,指向該原型對(duì)象對(duì)應(yīng)的構(gòu)造函數(shù)為什么有屬性那是因?yàn)槭堑膶?shí)例。 溫故 我們先回顧一下前兩天討論的內(nèi)容 創(chuàng)建對(duì)象的三種方式 通過(guò)對(duì)象直接量 通過(guò)new創(chuàng)建對(duì)象 通過(guò)Object.create() js中對(duì)象分為兩種 函數(shù)對(duì)象 普通對(duì)象 原型對(duì)象prototype 每一個(gè)函數(shù)對(duì)象都...
摘要:基本概念方法會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中非繼承屬性是否具有指定的屬性,如果具有帶指定名稱的屬性,則方法返回,否則返回。此方法不會(huì)檢查對(duì)象原型鏈中的屬性該屬性必須是對(duì)象本身的一個(gè)成員。使用語(yǔ)法參數(shù),必需。 hasOwnProperty基本概念 hasOwnProperty() 方法會(huì)返回一個(gè)布爾值,指示對(duì)象自身屬性中(非繼承屬性)是否具有指定的屬性,如果 object 具有帶指定...
摘要:也就是說(shuō),所有的函數(shù)和構(gòu)造函數(shù)都是由生成,包括本身。如果只考慮構(gòu)造函數(shù)和及其關(guān)聯(lián)的原型對(duì)象,在不解決懸念的情況下,圖形是這樣的可以看到,每一個(gè)構(gòu)造函數(shù)和它關(guān)聯(lián)的原型對(duì)象構(gòu)成一個(gè)環(huán),而且每一個(gè)構(gòu)造函數(shù)的屬性無(wú)所指。 前言 JavaScript 是我接觸到的第二門(mén)編程語(yǔ)言,第一門(mén)是 C 語(yǔ)言。然后才是 C++、Java 還有其它一些什么。所以我對(duì) JavaScript 是非常有感情的,畢...
閱讀 3560·2021-09-22 10:52
閱讀 1588·2021-09-09 09:34
閱讀 1990·2021-09-09 09:33
閱讀 758·2019-08-30 15:54
閱讀 2596·2019-08-29 11:15
閱讀 713·2019-08-26 13:37
閱讀 1667·2019-08-26 12:11
閱讀 2975·2019-08-26 12:00