国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript之原型與原型鏈

wuyangchun / 2233人閱讀

摘要:個(gè)人博客原文地址萬(wàn)物皆對(duì)象在中除值類型之外,其他的都是對(duì)象,為了說明這點(diǎn),我們舉幾個(gè)例子我們可以使用來(lái)做類型判斷除了屬于值類型之外,其他都是對(duì)象。

個(gè)人博客原文地址

萬(wàn)物皆對(duì)象

在JavaScript中除值類型之外,其他的都是對(duì)象,為了說明這點(diǎn),我們舉幾個(gè)例子
我們可以使用typeof來(lái)做類型判斷

typeof a;             // undefined
typeof 1;             // number
typeof "wclimb";      // string
typeof true;          // boolean

typeof function(){};  // function
typeof [];            // object
typeof null;          // object
typeof {};            // object

除了undefinednumberstringboolean屬于值類型之外,其他都是對(duì)象。你可能要問了,不是還有一個(gè)是function嗎?要校驗(yàn)他是不是應(yīng)該對(duì)象可以這樣做:

var fn = function(){}
fn instanceof Object // true

由上面的例子所示,函數(shù)確實(shí)是對(duì)象,為什么呢?我們看一下下面的例子

function Person(name){
    this.name = name; 
}
var person = new Person("wclimb");
console.log(person) // Person {name: "wclimb"}

由此我們可以得知,對(duì)象都是通過函數(shù)創(chuàng)建的,這么說你可能又會(huì)說不對(duì),你看下面的就不是函數(shù)創(chuàng)建的

var person = {name:"wclimb"}

你咋就這么飄呢?我竟無(wú)言以對(duì),沒錯(cuò),這是個(gè)意外、意外、意外。但是歸根結(jié)底他還是通過函數(shù)創(chuàng)建的

    var person = new Object()
    person.name = "wclimb"

so,現(xiàn)在你只要知道對(duì)象是通過函數(shù)創(chuàng)建的就可以了,來(lái)跟著我讀:
第一遍 對(duì)象都是通過函數(shù)創(chuàng)建的
第二遍 對(duì)象都是通過函數(shù)創(chuàng)建的
第三遍 對(duì)象都是通過函數(shù)創(chuàng)建的

構(gòu)造函數(shù)(constructor)
function Person(name){
    this.name = name
}
var person1 = new Person("wclimb 1")
var person2 = new Person("wclimb 2")

上面Person就是一個(gè)構(gòu)造函數(shù),我們通過new的方式創(chuàng)建了一個(gè)實(shí)例對(duì)象person
我們來(lái)看看person1和person2的constructor(構(gòu)造函數(shù))是不是指向Person的

person1.constructor === Person // true
person2.constructor === Person // true
原型(prototype)

在JavaScript中,每定義一個(gè)函數(shù)都會(huì)產(chǎn)生一個(gè)prototype(原型)屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象

function Person(){}
Person.prototype.name = "wclimb"
Person.prototype.age = "24"
Person.prototype.sayAge = function(){
    console.log(this.age)
}
var person = new Person()
person.sayAge(); //  24

那么這個(gè)prototype到底是什么呢?跟構(gòu)造函數(shù)有關(guān)系嗎?

上圖就可以反映出他們之間的關(guān)系

其實(shí)函數(shù)的prototype指向函數(shù)的原型對(duì)象,每個(gè)對(duì)象都會(huì)關(guān)聯(lián)另外一個(gè)對(duì)象,也就是原型,上面的例子改成:

Person.prototype = {
    name: "wclimb",
    age: 24,
    satAge: function(){
        console.log(this.age)
    }
}
隱式原型(__proto__)

上面我們說到每定義一個(gè)函數(shù)都會(huì)產(chǎn)生一個(gè)原型,每個(gè)函數(shù)它不止有原型,還有一個(gè)__proto__(隱式原型)
每個(gè)對(duì)象都有一個(gè)__proto__屬性,指向創(chuàng)建該對(duì)象函數(shù)的prototype,我們可以來(lái)試試,還是上面的例子:

function Person(){}
var person = new Person()
person.__proto__ === Person.prototype // true

現(xiàn)在他們的關(guān)系圖如下

由上圖我們可以知道:

Person.prototype.constructor = Person
person.__proto__ = Person.prototype
person.constructor = Person

我們可以看到person.__proto__指向構(gòu)造函數(shù)的原型,那么構(gòu)造函數(shù)的原型即Person__proto__指向哪里呢?
我們知道構(gòu)造函數(shù)其實(shí)就是由Function來(lái)創(chuàng)建的,由此得出:

Person.__proto__ === Function.prototype

那么構(gòu)造函數(shù)的原型即Person.prototype__proto__指向哪里呢?
原型對(duì)象其實(shí)是通過Object生成的,自然而然的得出:

Person.prototype.__proto__ === Object.prototype

那么Object.prototype__proto__指向哪里呢?答案是null,最終得到下面的圖

拋開這張圖,來(lái)看看下面幾道題

person.__proto__

Person.__proto__

Person.prototype.__proto__

Object.__proto__

Object.prototype.__proto__

解:

每個(gè)對(duì)象都有一個(gè)__proto__屬性,指向創(chuàng)建該對(duì)象函數(shù)的prototype,因?yàn)镻erson是person的構(gòu)造函數(shù)

Person === person.constructortrue,所以:person.__proto__ === Person.prototype

Person構(gòu)造函數(shù)是由Function創(chuàng)建的,所以可以得出Person.__proto__ === Fucntion.prototype

我們上面說過Person.prototype其實(shí)是一個(gè)對(duì)象,而對(duì)象是由Object創(chuàng)建的,所以 Person.prototype.__proto__ === Object.prototype

Object對(duì)象都是函數(shù)創(chuàng)建的,所以Object.__proto__ === Function.prototype

雖然Object.prototype是一個(gè)對(duì)象但是他的__proto__null

實(shí)例和原型

當(dāng)我們要取一個(gè)值的時(shí)候,會(huì)先從實(shí)例中取,如果實(shí)例中存在,則取實(shí)例的值,如果實(shí)例不存在,則會(huì)順著原型里找,直到找到

function Person(){}
Person.prototype.name = "我來(lái)自原型"

var person = new Person()
person.name = "我來(lái)自實(shí)例"
console.log(person.name); // 我來(lái)自實(shí)例
delete person.name
console.log(person.name)); // 我來(lái)自原型

首先person實(shí)例中有這個(gè)屬性,返回我來(lái)自實(shí)例,然后將它刪除之后,會(huì)從原型中招,也就是person.__proto__,因?yàn)?b>Person.prototype === person.__proto__,所以得到我來(lái)自原型

總結(jié)

原型和原型鏈基本已經(jīng)講解完,不過還有待完善,如有錯(cuò)誤,還望指正

GitHub:wclimb

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/96457.html

相關(guān)文章

  • 進(jìn)擊JavaScript(四)原型原型

    摘要:每一個(gè)由構(gòu)造函數(shù)創(chuàng)建的對(duì)象都會(huì)默認(rèn)的連接到該神秘對(duì)象上。在構(gòu)造方法中也具有類似的功能,因此也稱其為類實(shí)例與對(duì)象實(shí)例一般是指某一個(gè)構(gòu)造函數(shù)創(chuàng)建出來(lái)的對(duì)象,我們稱為構(gòu)造函數(shù)的實(shí)例實(shí)例就是對(duì)象。表示該原型是與什么構(gòu)造函數(shù)聯(lián)系起來(lái)的。 本文您將看到以下內(nèi)容: 傳統(tǒng)構(gòu)造函數(shù)的問題 一些相關(guān)概念 認(rèn)識(shí)原型 構(gòu)造、原型、實(shí)例三角結(jié)構(gòu)圖 對(duì)象的原型鏈 函數(shù)的構(gòu)造函數(shù)Function 一句話說明什么...

    XBaron 評(píng)論0 收藏0
  • Javascript重溫OOP原型原型

    摘要:在構(gòu)造函數(shù)中的中定義的屬性和方法,會(huì)被創(chuàng)建的對(duì)象所繼承下來(lái)。從上面的輸出結(jié)果看出,指向了其構(gòu)造函數(shù)的,而本身也是一個(gè)對(duì)象,其內(nèi)部也有屬性,其指向的是直到最后指向,這條原型鏈才結(jié)束。和都指向,說明原型鏈到終止。 prototype原型對(duì)象 每個(gè)函數(shù)都有一個(gè)默認(rèn)的prototype屬性,其實(shí)際上還是一個(gè)對(duì)象,如果被用在繼承中,姑且叫做原型對(duì)象。 在構(gòu)造函數(shù)中的prototype中定義的屬性...

    lindroid 評(píng)論0 收藏0
  • JavaScript深入原型原型

    摘要:深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來(lái)看看這篇文章吧。讓我們用一張圖表示構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系在這張圖中我們用表示實(shí)例原型。 JavaScript深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實(shí)例的原型,原型的原型,原型的原型的原型是什么,就來(lái)看看這篇文章吧。 構(gòu)造函數(shù)創(chuàng)建對(duì)象 我們先...

    Songlcy 評(píng)論0 收藏0
  • JavaScript 原型周邊

    摘要:除此之外,原型是共享的,如果我們有的寫法,改變這兩個(gè)對(duì)象任何一個(gè)的原型都會(huì)影響另外一個(gè),這在大多的情況下是不可取的。當(dāng)對(duì)象查找一個(gè)屬性的時(shí)候,他會(huì)沿著原型鏈一直往上追蹤,直到直到為之。在性能方面,原則上應(yīng)該盡量避免原型鏈太長(zhǎng)。 簡(jiǎn)介 如果之間學(xué)習(xí)過cpp 、java 之類的語(yǔ)言,都會(huì)知道他們是可以基于類 class 進(jìn)行繼承的, 在JavaScript 中,并沒有類繼承這個(gè)概念,要實(shí)...

    codecook 評(píng)論0 收藏0
  • 深入學(xué)習(xí)js——原型原型

    摘要:我們用一張圖表示構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系好了構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系我們已經(jīng)梳理清楚了,那我們?cè)趺幢硎緦?shí)例與實(shí)例原型,也就是或者和之間的關(guān)系呢。 開篇: 在Brendan Eich大神為JavaScript設(shè)計(jì)面向?qū)ο笙到y(tǒng)的時(shí)候,借鑒了Self 和Smalltalk這兩門基于原型的語(yǔ)言,之所以選擇基于原型的面向?qū)ο笙到y(tǒng),并不是因?yàn)闀r(shí)間匆忙,它設(shè)計(jì)起來(lái)相對(duì)簡(jiǎn)單,而是因?yàn)閺囊婚_始B...

    FingerLiu 評(píng)論0 收藏0
  • 深入學(xué)習(xí)js——原型原型

    摘要:我們用一張圖表示構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系好了構(gòu)造函數(shù)和實(shí)例原型之間的關(guān)系我們已經(jīng)梳理清楚了,那我們?cè)趺幢硎緦?shí)例與實(shí)例原型,也就是或者和之間的關(guān)系呢。 開篇: 在Brendan Eich大神為JavaScript設(shè)計(jì)面向?qū)ο笙到y(tǒng)的時(shí)候,借鑒了Self 和Smalltalk這兩門基于原型的語(yǔ)言,之所以選擇基于原型的面向?qū)ο笙到y(tǒng),并不是因?yàn)闀r(shí)間匆忙,它設(shè)計(jì)起來(lái)相對(duì)簡(jiǎn)單,而是因?yàn)閺囊婚_始B...

    xialong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<