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

資訊專欄INFORMATION COLUMN

JavaScript基礎(chǔ)之創(chuàng)建對(duì)象、原型、原型對(duì)象、原型鏈

wangbjun / 1911人閱讀

摘要:在最開(kāi)始的時(shí)候,原型對(duì)象的設(shè)計(jì)主要是為了獲取對(duì)象的構(gòu)造函數(shù)。同理數(shù)組通過(guò)調(diào)用函數(shù)通過(guò)調(diào)用原型鏈中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法。

對(duì)象的創(chuàng)建

在JavaScript中創(chuàng)建一個(gè)對(duì)象有三種方式。可以通過(guò)對(duì)象直接量關(guān)鍵字newObject.create()函數(shù)來(lái)創(chuàng)建對(duì)象。

1. 對(duì)象直接量

創(chuàng)建對(duì)象最直接的方式就是在JavaScript代碼中使用對(duì)象直接量。在ES5中對(duì)象直接量是由若干 名/值組成的映射表, 整個(gè)映射表由{}包含起來(lái)。每個(gè)名/值中間使用:進(jìn)行分割,名/值之間使用,進(jìn)行分割。

var o1 = {};
var o2 = {name: "javascript"}
var o3 = {title: "object", o2: o2} 
// 數(shù)組、日期、函數(shù)、正則等作為特殊的對(duì)象,這里暫不討論
// ES6 也暫時(shí)不討論

上面就是使用對(duì)象直接量創(chuàng)建對(duì)象,這種方式比較簡(jiǎn)單方便。

2. 通過(guò)new創(chuàng)建對(duì)象

通過(guò)關(guān)鍵字new + 函數(shù)調(diào)用,就可以創(chuàng)建一個(gè)新的對(duì)象。被調(diào)用的函數(shù)被稱為構(gòu)造函數(shù)。 根據(jù)高程中描述,使用 new + 調(diào)用函數(shù) 創(chuàng)建一個(gè)對(duì)象,這種方式會(huì)經(jīng)歷以下 4 個(gè)步驟:

(1) 創(chuàng)建一個(gè)新對(duì)象;
(2) 將構(gòu)造函數(shù)的作用域賦給新對(duì)象(因此 this 就指向了這個(gè)新對(duì)象);
(3) 執(zhí)行構(gòu)造函數(shù)中的代碼(為這個(gè)新對(duì)象添加屬性);
(4) 返回新對(duì)象。

舉個(gè)例子:

    var Foo = function(name) {
         this.name = name
    }
    
    var foo = new Foo("我"); 
    /*
        var foo = new Foo("我") 
        創(chuàng)建對(duì)象大致的流程是
        (1)  var obj = {};
        `高程`中步驟(2),(3)如果不清楚的小伙伴,可以參考下面的實(shí)現(xiàn)
        (2)、(3) Foo.call(obj); call 方法能夠改變函數(shù)Foo的執(zhí)行上下,把this指向obj,然后執(zhí)行Foo函數(shù)
        (4) foo = obj;   
    */
    typeof foo; // "object"
    foo.constructor === Foo // true  
3. 通過(guò)Object.create() 創(chuàng)建對(duì)象

這里是ES5官方提供的一個(gè)創(chuàng)建對(duì)象的方法。

    var obj = {name: "javascript"};
    var newObj = Object.create(obj);
    newObj.name // => javascript
原型

JS中每個(gè)函數(shù)都可以看成一個(gè)對(duì)象,而原型(prototype)就是函數(shù)中的其中一個(gè)屬性。這里要很清楚,原型是函數(shù)上面的一個(gè)屬性,這個(gè)屬性只有函數(shù)對(duì)象才能擁有,別的類型是沒(méi)有prototype屬性。而原型的作用就是它所引用的對(duì)象能夠被擁有它的函數(shù)所構(gòu)建的實(shí)例化對(duì)象所訪問(wèn)。

那么原型是怎么和對(duì)象建立聯(lián)系的?

編寫(xiě)代碼如下:

let obj = {name: "javascript"};
console.log(obj.name) // => javascript
console.log(obj)

控制臺(tái)輸出如下:

我們?cè)诔绦蛑卸x一個(gè)JavaScript對(duì)象,然后打印這個(gè)對(duì)象,這里除了前面定義的name屬性外,還有另外一個(gè)__proto__屬性。前面說(shuō)道 函數(shù) 上面的 prototype(原型)所指向的對(duì)象能夠擁有它的函數(shù)所構(gòu)建的實(shí)例化對(duì)象所訪問(wèn)。至于具體怎么訪問(wèn)的細(xì)節(jié)沒(méi)有說(shuō)明。其實(shí)就是通過(guò)__proto__這個(gè)屬性作為橋梁進(jìn)行的聯(lián)接。

let obj = {name: "javascript"};
console.log(obj.__proto__ === Object.prototype) //true

對(duì)比發(fā)現(xiàn)__proto__所指的對(duì)象和Object.prototype所指的是一樣的。我們是可以認(rèn)定__proto__就是這座橋梁,那么obj就能訪問(wèn)到Object.prototype所指的對(duì)象就是理所當(dāng)然了。

于是我就在猜測(cè)在使用直接定義量去定義對(duì)象的時(shí)候,在底層的實(shí)現(xiàn)很有可能就是通過(guò)new Object()的這種方式實(shí)現(xiàn)的。

于是我編寫(xiě)了下面的測(cè)試代碼:

 let obj = {name: "javascript"};
 let obj1 = new Object({name: "javascript"});

發(fā)現(xiàn)上面的obj與obj1兩者數(shù)據(jù)結(jié)構(gòu)基本一致。

原型對(duì)象

原型對(duì)象簡(jiǎn)單來(lái)說(shuō)就是函數(shù)的原型所指向的對(duì)象。前面說(shuō)原型的時(shí)候,說(shuō)了Object.prototype所指對(duì)象就是Object(函數(shù))的原型對(duì)象。 在每個(gè)函數(shù)的原型對(duì)象中,默認(rèn)會(huì)有constructor屬性,用于指向函數(shù)本身。

Object.prototype.constructor === Object // true
let Test = function() {console.log("test")};
Test.prototype.constructor === Test // true

在最開(kāi)始的時(shí)候,原型對(duì)象的constructor設(shè)計(jì)主要是為了獲取對(duì)象的構(gòu)造函數(shù)。后來(lái)發(fā)現(xiàn)constructor屬性易變,不可信。推薦使用instanceof。

var Test = function() {console.log("test")};
var test = new Test();
console.log(test.constructor); // Test
test.constructor = Object;
console.log(test.constructor); // Object
/*這里想使用 test.constructor 來(lái)判斷是否是Test的實(shí)例化對(duì)象就不可信。而應(yīng)該使用 instanceof */
test instanceof Test // true

原型對(duì)象有什么作用,主要實(shí)現(xiàn)對(duì)象的繼承。

例如我們常用的對(duì)象、數(shù)組、函數(shù)都是得益于原型。

當(dāng)我們使用變量直接量定義一個(gè)對(duì)象的時(shí)候,其實(shí)我們是沒(méi)有定義它上面的這些能夠調(diào)用的方法

let obj = {};


這些方法怎么來(lái)的,就是通過(guò)調(diào)用Object上面的原型對(duì)象而來(lái)的。

console.log(Object.prototype)


同理數(shù)組(通過(guò)調(diào)用Array.prototype),函數(shù)(通過(guò)調(diào)用Function.prototype)

原型鏈

ECMAScript中描述了原型鏈的概念,并將原型鏈作為實(shí)現(xiàn)繼承的主要方法。其基本思想是利用原 型讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。簡(jiǎn)單回顧一下構(gòu)造函數(shù)、原型和實(shí)例的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。那么,假如我們讓原型對(duì)象等于另一個(gè)類型的實(shí)例,結(jié)果會(huì)怎么樣呢?顯然,此時(shí)的 原型對(duì)象將包含一個(gè)指向另一個(gè)原型的指針,相應(yīng)地,另一個(gè)原型中也包含著一個(gè)指向另一個(gè)構(gòu)造函數(shù) 的指針。假如另一個(gè)原型又是另一個(gè)類型的實(shí)例,那么上述關(guān)系依然成立,如此層層遞進(jìn),就構(gòu)成了實(shí) 例與原型的鏈條。這就是所謂原型鏈的基本概念。

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

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

相關(guān)文章

  • JS面向對(duì)象二:this/原型/new原理

    摘要:情況沒(méi)有明確作用對(duì)象的情況下,通常為全局對(duì)象例如函數(shù)的回調(diào)函數(shù),它的就是全局對(duì)象。正因如此,機(jī)器可以作為這類對(duì)象的標(biāo)志,即面向?qū)ο笳Z(yǔ)言中類的概念。所以機(jī)器又被稱為構(gòu)造函數(shù)。原型鏈也就是繼承鏈。 JS面向?qū)ο蠖?this/原型鏈/new原理 阮一峰JavaScript教程:面向?qū)ο缶幊?阮一峰JavaScript教程:實(shí)例對(duì)象與 new 命令 阮一峰JavaScript教程:this 關(guān)...

    anRui 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    Lyux 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(duì)象”還好嗎?

    摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...

    AaronYuan 評(píng)論0 收藏0
  • JS面向對(duì)象的程序設(shè)計(jì)繼承的實(shí)現(xiàn) - 原型

    摘要:簡(jiǎn)單回顧一下構(gòu)造函數(shù)原型和實(shí)例對(duì)象之間的關(guān)系每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象。找到生成構(gòu)造函數(shù)的原型對(duì)象的構(gòu)造函數(shù),搜索其原型對(duì)象,找到了。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn) - 原型鏈 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書(shū)中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaS...

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

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

0條評(píng)論

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