摘要:注意,此處的構(gòu)造函數(shù)指的是使用方式的構(gòu)造函數(shù)。也就是說(shuō),你可以在支持該實(shí)現(xiàn)的瀏覽器下,,,去訪問(wèn)對(duì)象的構(gòu)造函數(shù)的原型對(duì)象。另外一種判斷實(shí)例對(duì)象和其原型對(duì)象存在指向關(guān)系由實(shí)例的指向其構(gòu)造函數(shù)的原型對(duì)象的方法是。
這里,我們列出原型的幾個(gè)概念,如下:
prototype屬性
[[prototype]]
__proto__
prototype屬性只要?jiǎng)?chuàng)建了一個(gè)函數(shù),就會(huì)為該函數(shù)創(chuàng)建一個(gè)prototype屬性,指向該函數(shù)的原型對(duì)象。實(shí)例對(duì)象是不會(huì)擁有該屬性的。
默認(rèn)情況下,該原型對(duì)象也會(huì)獲得一個(gè)constructor屬性,該屬性包含一個(gè)指針,指向prototype屬性所在的函數(shù)。
function Person() {}// 只是一個(gè)函數(shù)而已 Person.prototype.constructor === Person[[prototype]]和__proto__
javascript中,不可以訪問(wèn)的內(nèi)部屬性都是用[[propertyName]]這種形式來(lái)表示的,比如還有枚舉屬性[[Enumberable]]。
[[prototype]]屬性只能是對(duì)象可以擁有的屬性。比如實(shí)例化的對(duì)象以及原型對(duì)象,而不是構(gòu)造函數(shù)。這個(gè)屬性指向擁有其屬性的對(duì)象的構(gòu)造函數(shù)的原型對(duì)象。注意,此處的構(gòu)造函數(shù)指的是使用new方式的構(gòu)造函數(shù)。并不因?yàn)楦牧嗽蛯?duì)象上的constructor屬性而改變。
比如:
function Person() {} Person.prototype.constructor = {}; // 此處修改了Person原型的構(gòu)造函數(shù)指向 let p = new Person(); p.__proto__ === Person.prototype; // true
__proto__是個(gè)啥呢,就是對(duì)[[propertyName]]的實(shí)現(xiàn)。也就是說(shuō),你可以在支持該實(shí)現(xiàn)的瀏覽器下(FF,chrome,safari),去訪問(wèn)對(duì)象的構(gòu)造函數(shù)的原型對(duì)象。比如:
var Person = function(name) { this.name = name; }; var p1 = new Person(); p1.__proto__=== Person.prototype; // true Person.prototype = {}; var p2 = new Person(); p2.__proto__ === Object.prototype; // false
當(dāng)然,__proto__只是瀏覽器的私有實(shí)現(xiàn),目前ECMAScript標(biāo)準(zhǔn)實(shí)現(xiàn)方法是Object.getPrototypeOf(object)。
var Person = function(name) { this.name = name; }; var p1 = new Person(); Object.getPrototypeOf(p1) === Person.prototype; // true Person.prototype = {}; var p2 = new Person(); Object.getPrototypeOf(p2) === Object.prototype; // false
另外一種判斷實(shí)例對(duì)象和其原型對(duì)象存在指向關(guān)系(由實(shí)例的[[prototype]]指向其構(gòu)造函數(shù)的原型對(duì)象)的方法是:isPrototypeOf。比如:
Person.prototype.isPrototypeOf(p1); // true
由于函數(shù)和原型對(duì)象也是一個(gè)對(duì)象,所以,它自然而然也擁有[[prototype]]屬性。
弄清楚了這些概念,原型鏈,繼承等存在的一些問(wèn)題,都不是問(wèn)題了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/78159.html
摘要:首先,需要來(lái)理清一些基礎(chǔ)的計(jì)算機(jī)編程概念編程哲學(xué)與設(shè)計(jì)模式計(jì)算機(jī)編程理念源自于對(duì)現(xiàn)實(shí)抽象的哲學(xué)思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過(guò)程式和函數(shù)式編程。 JavaScript 中的原型機(jī)制一直以來(lái)都被眾多開(kāi)發(fā)者(包括本人)低估甚至忽視了,這是因?yàn)榻^大多數(shù)人沒(méi)有想要深刻理解這個(gè)機(jī)制的內(nèi)涵,以及越來(lái)越多的開(kāi)發(fā)者缺乏計(jì)算機(jī)編程相關(guān)的基礎(chǔ)知識(shí)。對(duì)于這樣的開(kāi)發(fā)者來(lái)說(shuō) J...
摘要:我們已經(jīng)回答了的構(gòu)造函數(shù)和原型都是誰(shuí)的問(wèn)題,現(xiàn)在牽扯出來(lái)一個(gè),我們繼續(xù)檢查的構(gòu)造函數(shù)是全局對(duì)象上屬性叫的對(duì)象的原型是個(gè)匿名函數(shù),按照關(guān)于構(gòu)造函數(shù)的約定,它應(yīng)該是構(gòu)造函數(shù)的屬性我們給這個(gè)對(duì)象起個(gè)名字,叫。 我不確定JavaScript語(yǔ)言是否應(yīng)該被稱(chēng)為Object-Oriented,因?yàn)镺bject Oriented是一組語(yǔ)言特性、編程模式、和設(shè)計(jì)與工程方法的籠統(tǒng)稱(chēng)謂,沒(méi)有一個(gè)詳盡和大家...
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱(chēng)為構(gòu)造函數(shù)繼承,在中是一種關(guān)鍵的實(shí)現(xiàn)的繼承方法,相信你已經(jīng)很好的掌握了。 你應(yīng)該知道,JavaScript是一門(mén)基于原型鏈的語(yǔ)言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關(guān)。甚至可以說(shuō),所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構(gòu)造函數(shù),原型屬性與實(shí)例對(duì)象 要搞清楚如何在JavaScript中實(shí)現(xiàn)繼承,...
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類(lèi)的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街校瑢?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫(xiě)風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門(mén)語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門(mén)面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從?duì)語(yǔ)言感悟的角度闡述為什...
摘要:原型之所以被稱(chēng)為原型,可能正是因?yàn)檫@種不可重載的特質(zhì)。而一旦實(shí)例化,那么將指向?qū)嵗膶?duì)象。首先是,我使用了,直接利用貓咪的年齡進(jìn)行計(jì)算得出體重返回給屬性。 和java比起來(lái),javascript真的是松散的無(wú)以復(fù)加,不過(guò)這也讓我們?cè)跓o(wú)聊之余,有精力去探討一些復(fù)雜的應(yīng)用,從而在開(kāi)發(fā)之路上,獲得一些新的想法。 javascript中的類(lèi)的構(gòu)造 javascript中有對(duì)象的概念,卻沒(méi)有類(lèi)...
閱讀 5401·2023-04-25 19:30
閱讀 2261·2023-04-25 15:09
閱讀 2699·2021-11-16 11:45
閱讀 2278·2021-11-15 18:07
閱讀 1526·2021-11-11 17:22
閱讀 2191·2021-11-04 16:06
閱讀 3640·2021-10-20 13:47
閱讀 3091·2021-09-22 16:03