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