欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談JS的原型和繼承

 更新時(shí)間:2019年05月08日 09:26:35   作者:cywdm5  
這篇文章主要介紹了JS原型和繼承,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

參考文獻(xiàn)

JavaScript原型與繼承的秘密

__proto__

除null和undefined,JS中的所有數(shù)據(jù)類型都有這個(gè)屬性; 它表示當(dāng)我們?cè)L問(wèn)一個(gè)對(duì)象的某個(gè)屬性時(shí),如果該對(duì)象自身不存在該屬性, 就從它的__proto__屬性上繼續(xù)查找,以此類推,直到找到,若找到最后還是沒有找到,則結(jié)果為undefined

我們把一個(gè)對(duì)象的__proto__屬性所指向的對(duì)象叫該對(duì)象的原型;我們可以修改一個(gè)對(duì)象的原型來(lái)讓這個(gè)對(duì)象擁有某種屬性或某個(gè)方法

// 修改一個(gè)Number類型的值的原型
const num = 1;
num.__proto__.name = "My name is 1";
console.log(num.name); // My name is 1
 
// 修改一個(gè)對(duì)象的原型
const obj = {};
obj.__proto__.name = "dreamapple";
console.log(obj.name); // dreamapple

需注意的是,__proto__屬性雖多數(shù)瀏覽器支持,但其實(shí)它僅在ECMAScript 2015規(guī)范中才被準(zhǔn)確定義, 目的是為了給這個(gè)傳統(tǒng)的功能定制一個(gè)標(biāo)準(zhǔn),以確保瀏覽器間的兼容性。通過(guò)使用__proto__屬性來(lái)修改一個(gè)對(duì)象的原型非常慢且影響性能。 所以,若想獲取一個(gè)對(duì)象的原型,推薦用Object.getPrototypeOf 或Reflect.getPrototypeOf,設(shè)置一個(gè)對(duì)象的原型推薦用Object.setPrototypeOf或Reflect.setPrototypeOf

prototype

首先要記住的是,該屬性一般只存在于函數(shù)對(duì)象上; 只要是能作為構(gòu)造器的函數(shù),都包含這個(gè)屬性。即只要這個(gè)函數(shù)能通過(guò)new生成一個(gè)新對(duì)象, 那么這個(gè)函數(shù)肯定具有prototype屬性。因?yàn)槲覀冏远x的函數(shù)都可通過(guò)new生成一個(gè)對(duì)象,所以我們自定義的函數(shù)都有prototype 這個(gè)屬性

// 函數(shù)字面量
console.log((function(){}).prototype); // {constructor: ƒ}
 
// Date構(gòu)造器
console.log(Date.prototype); // {constructor: ƒ, toString: ƒ, toDateString: ƒ, toTimeString: ƒ, toISOString: ƒ, …}
 
// Math.abs 不是構(gòu)造器,不能通過(guò)new操作符生成一個(gè)新的對(duì)象,所以不含有prototype屬性
console.log(Math.abs.prototype); // undefined

prototype屬性有什么作用呢?作用就是:函數(shù)通過(guò)new生成的一個(gè)對(duì)象, 這個(gè)對(duì)象的原型(__proto__)指向該函數(shù)的prototype屬性:

// 其中F表示一個(gè)自定義的函數(shù)或者是含有prototype屬性的內(nèi)置函數(shù)
new F().__proto__ === F.prototype // true
 
// 通過(guò)函數(shù)字面量定義的函數(shù)的__proto__屬性都指向Function.prototype
(function(){}).__proto__ === Function.prototype // true
 
// 通過(guò)對(duì)象字面量定義的對(duì)象的__proto__屬性都是指向Object.prototype
({}).__proto__ === Object.prototype // true
 
// Object函數(shù)的原型的__proto__屬性指向null
Object.prototype.__proto__ === null // true
 
// 因?yàn)镕unction本身也是一個(gè)函數(shù),所以Function函數(shù)的__proto__屬性指向它自身的prototype
Function.__proto__ === Function.prototype // true
 
// 因?yàn)镕unction的prototype是一個(gè)對(duì)象,所以Function.prototype的__proto__屬性指向Object.prototype
Function.prototype.__proto__ === Object.prototype // true

constructor

constructor表示一個(gè)對(duì)象的構(gòu)造函數(shù),除null和undefined,JS中的所有數(shù)據(jù)類型都有這個(gè)屬性; 我們可通過(guò)下面的代碼來(lái)驗(yàn)證一下:

null.constructor // Uncaught TypeError: Cannot read property 'constructor' of null ...
undefined.constructor // Uncaught TypeError: Cannot read property 'constructor' of undefined ...
 
(true).constructor // ƒ Boolean() { [native code] }
(1).constructor // ƒ Number() { [native code] }
"hello".constructor // ƒ String() { [native code] }

一個(gè)對(duì)象的constructor屬性確切地說(shuō)并不是存在這個(gè)對(duì)象上面的; 而是存在這個(gè)對(duì)象的原型上(如果是多級(jí)繼承需手動(dòng)修改原型的constructor屬性),我們可用下面的代碼來(lái)解釋一下:

const F = function() {};
// 當(dāng)我們定義一個(gè)函數(shù)的時(shí)候,這個(gè)函數(shù)的prototype屬性上面的constructor屬性指向自己本身
F.prototype.constructor === F; // true

對(duì)JS的原始類型(string, number, boolean, null, undefined, symbol (new in ECMAScript 2015)),它們的constructor屬性是只讀的,不可修改:

(1).constructor = "something";
console.log((1).constructor); // 輸出 ƒ Number() { [native code] }

如果真想改這些原始類型的constructor屬性,也不是不可以:

Number.prototype.constructor = "number constructor";
(1).constructor = 1;
console.log((1).constructor); // 輸出 number constructor

當(dāng)然上面的方式不推薦

以上所述是小編給大家介紹的JS原型和繼承詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Js Snowflake(雪花算法)生成隨機(jī)ID的實(shí)現(xiàn)方法

    Js Snowflake(雪花算法)生成隨機(jī)ID的實(shí)現(xiàn)方法

    這篇文章主要介紹了Js Snowflake(雪花算法)生成隨機(jī)ID的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • JS實(shí)現(xiàn)模態(tài)框拖拽動(dòng)態(tài)效果

    JS實(shí)現(xiàn)模態(tài)框拖拽動(dòng)態(tài)效果

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)模態(tài)框拖拽動(dòng)態(tài)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 小議Javascript中的this指針

    小議Javascript中的this指針

    在全局執(zhí)行環(huán)境中使用this,標(biāo)識(shí)Global對(duì)象,在瀏覽器中就是window對(duì)象。
    2010-03-03
  • JavaScript單元測(cè)試ABC

    JavaScript單元測(cè)試ABC

    在服務(wù)器端的單元測(cè)試中,都有各種各樣的測(cè)試框架,在JavaScript中現(xiàn)在也有一些很優(yōu)秀的框架,但在本文中,我們將自己動(dòng)手一步步來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的單元測(cè)試框架
    2012-04-04
  • JavaScript中eval和with語(yǔ)句如何影響作用域鏈的深度探索

    JavaScript中eval和with語(yǔ)句如何影響作用域鏈的深度探索

    這篇文章主要為大家介紹了JavaScript中eval和with語(yǔ)句如何影響作用域鏈的深度探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 2007/12/23更新創(chuàng)意無(wú)限,簡(jiǎn)單實(shí)用(javascript log)

    2007/12/23更新創(chuàng)意無(wú)限,簡(jiǎn)單實(shí)用(javascript log)

    在javascript開發(fā)過(guò)程中,如果總是使用alert的方式調(diào)試程序,在某些簡(jiǎn)單的程序中是可行的. 但是在通常的項(xiàng)目很復(fù)雜,這種方式已經(jīng)很難滿足,企業(yè)級(jí)開發(fā)的需要。
    2007-12-12
  • 利用MutationObserver實(shí)現(xiàn)計(jì)算首屏?xí)r間

    利用MutationObserver實(shí)現(xiàn)計(jì)算首屏?xí)r間

    在前端開發(fā)中,優(yōu)化頁(yè)面性能是至關(guān)重要的,計(jì)算首屏?xí)r間是衡量網(wǎng)頁(yè)性能的重要指標(biāo),本文將介紹如何使用MutationObserver來(lái)獲取首屏?xí)r間的最佳實(shí)踐,感興趣的可以了解下
    2023-07-07
  • JS實(shí)現(xiàn)放大鏡效果

    JS實(shí)現(xiàn)放大鏡效果

    這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)放大鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • JS/HTML5游戲常用算法之碰撞檢測(cè) 包圍盒檢測(cè)算法詳解【矩形情況】

    JS/HTML5游戲常用算法之碰撞檢測(cè) 包圍盒檢測(cè)算法詳解【矩形情況】

    這篇文章主要介紹了JS/HTML5游戲常用算法之碰撞檢測(cè) 包圍盒檢測(cè)算法,結(jié)合實(shí)例形式詳細(xì)分析了游戲算法中針對(duì)碰撞檢測(cè)的包盒矩形情況下的相關(guān)算法原理與操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • 完美解決mui框架off-canvas側(cè)滑超出部分隱藏?zé)o法滾動(dòng)的問(wèn)題

    完美解決mui框架off-canvas側(cè)滑超出部分隱藏?zé)o法滾動(dòng)的問(wèn)題

    下面小編就為大家分享一篇完美解決mui框架off-canvas側(cè)滑超出部分隱藏?zé)o法滾動(dòng)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01

最新評(píng)論