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

資訊專欄INFORMATION COLUMN

JavaScript之原型與原型鏈

wuyangchun / 2234人閱讀

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

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

萬物皆對象

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

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

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

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

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

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

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

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

var person = {name:"wclimb"}

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

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

so,現(xiàn)在你只要知道對象是通過函數(shù)創(chuàng)建的就可以了,來跟著我讀:
第一遍 對象都是通過函數(shù)創(chuàng)建的
第二遍 對象都是通過函數(shù)創(chuàng)建的
第三遍 對象都是通過函數(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í)例對象person
我們來看看person1和person2的constructor(構(gòu)造函數(shù))是不是指向Person的

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

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

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ù)的原型對象,每個(gè)對象都會關(guān)聯(lián)另外一個(gè)對象,也就是原型,上面的例子改成:

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

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

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來創(chuàng)建的,由此得出:

Person.__proto__ === Function.prototype

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

Person.prototype.__proto__ === Object.prototype

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

拋開這張圖,來看看下面幾道題

person.__proto__

Person.__proto__

Person.prototype.__proto__

Object.__proto__

Object.prototype.__proto__

解:

每個(gè)對象都有一個(gè)__proto__屬性,指向創(chuàng)建該對象函數(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è)對象,而對象是由Object創(chuàng)建的,所以 Person.prototype.__proto__ === Object.prototype

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

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

實(shí)例和原型

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

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

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

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

總結(jié)

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

GitHub:wclimb

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

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

相關(guān)文章

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

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

    XBaron 評論0 收藏0
  • Javascript重溫OOP原型原型

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

    lindroid 評論0 收藏0
  • JavaScript深入原型原型

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

    Songlcy 評論0 收藏0
  • JavaScript 原型周邊

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

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

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

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

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

    xialong 評論0 收藏0

發(fā)表評論

0條評論

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