摘要:原型的作用通過構(gòu)造函數(shù)創(chuàng)建的對象,可以使用原型上的屬性和方法,即原型可以讓實例共享它的方法和屬性。
1、什么是原型?
原型是函數(shù)自帶的一個屬性prototype,該屬性的值指向一個對象 ( 因為存的是對象的指針 )。
2、原型的作用通過構(gòu)造函數(shù)創(chuàng)建的對象,可以使用原型上的屬性和方法,即原型可以讓實例共享它的方法和屬性。
function Car(brand) { this.brand = brand; } // 原型 Car.prototype.drive = function() { console.log("開車"); } // 創(chuàng)建對象(實例) var x3 = new Car("BMW"); var glc300 = new Car("Benz"); // 兩個實例都可以訪問原型上的方法 x3.drive(); glc300.drive();3、prototype
函數(shù)默認(rèn)就有的屬性,這個屬性指向原型(原型對象)。
4、__proto__對象默認(rèn)就有的屬性,這個屬性也指向原型(原型對象)。
5、原型的稱呼問題prototype 這個屬性, 我們稱之為原型屬性, 或者顯示原型
.__proto__ 這個屬性, 我們稱之為原型對象, 或者隱式原型
它們兩個是不同的屬性
prototype是函數(shù)的屬性,它存的是對象的指針,指向原型對象
函數(shù)中prototype的作用:
將來創(chuàng)建的實例對象的__proto__屬性會根據(jù)構(gòu)造函數(shù)的prototype屬性來定義。
__proto__是對象的屬性,它也指向原型
對象中__proto__的作用:
對象可以訪問__proto__屬性所指向的那個原型對象中的屬性和方法
7、constructor所有原生的原型都有這個屬性,該屬性的值存的是構(gòu)造函數(shù)的指針(地址)
因為構(gòu)造函數(shù).prototype 的值可以被改變,所以修改之后就不是原生原型了。
function Car(brand) { this.brand = brand; } // 原型 Car.prototype.drive = function() { console.log("開車"); } // 創(chuàng)建對象(實例) var x3 = new Car("BMW"); // 可以獲取對象的具體類型 console.log(x3.constructor.name); // 輸出Car // 動態(tài)修改原型的屬性, 盡量不要這么干, 最好一次性在最初就定義好 Car.prototype.drive = function() { console.log("飚車"); }8、原型鏈
javascript中的對象都有一個內(nèi)置的proto屬性,這個屬性指向創(chuàng)建該對象的構(gòu)造函數(shù)的prototype(Fucntion.prototype-原型對象),這個原型對象也是對象,也會有自己的proto,指向它自己的原型對象,這樣直到某個對象的原型為null為止,這樣的一級一級的鏈結(jié)構(gòu)就稱為原型鏈。
// 實例對象f的原型 指向 原型對象F.prototype f.__proto__ => F.prototype, // 原型對象F.prototype的原型 指向 原型對象Object.prototype F.prototype.__proto__ => Object.prototype, // 原型對象Object.prototype的原型 指向 null Object.prototype.__proto__ => null
原型鏈的作用就是用來實現(xiàn)繼承(繼承:對象可以使用不屬于自己的屬性或者方法);
當(dāng)訪問一個對象的屬性或者方法時,首先會在對象的自身查找,
如果沒有,則根據(jù)該對象的proto屬性的指向,到該對象的原型對象上查找,
如果還沒有找到,就再根據(jù)原型對象的proto去查找,一直到Object.prototype為止。
舉個栗子
var arr = []; console.log(arr.hasOwnProperty("push")); // false console.log(Array.hasOwnProperty("push")); // false console.log(Array.prototype.hasOwnProperty("push")); // true console.log(arr.push === Array.prototype.push); // true 比如我們創(chuàng)建一個數(shù)組, 數(shù)組arr本身是沒有push方法的, push方法就是從數(shù)組的原型對象上繼承而來的.
最后是一張原型 繼承結(jié)構(gòu)的圖
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/80626.html
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈?zhǔn)菍崿F(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈?zhǔn)菍崿F(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...
摘要:一般我們對這種構(gòu)造函數(shù)命名都會采用,并把它稱呼為類,這不僅是為了跟的理念保持一致,也是因為的內(nèi)建類也是這種命名。由生成的對象,其是。這是標(biāo)準(zhǔn)的規(guī)定。本文的主題是原型系統(tǒng)的變遷,所以并沒有涉及和對原型鏈的影響。 概述 JavaScript 的原型系統(tǒng)是最初就有的語言設(shè)計。但隨著 ES 標(biāo)準(zhǔn)的進(jìn)化和新特性的添加。它也一直在不停進(jìn)化。這篇文章的目的就是梳理一下早期到 ES5 和現(xiàn)在 ES6,...
摘要:為了防止之后自己又開始模糊,所以自己來總結(jié)一下中關(guān)于作用域鏈和原型鏈的知識,并將二者相比較看待進(jìn)一步加深理解。因此我們發(fā)現(xiàn)當(dāng)多個作用域相互嵌套的時候,就形成了作用域鏈。原型鏈原型說完了作用域鏈,我們來講講原型鏈。 畢業(yè)也整整一年了,看著很多學(xué)弟都畢業(yè)了,忽然心中頗有感慨,時間一去不復(fù)還呀。記得從去年這個時候接觸到JavaScript,從一開始就很喜歡這門語言,當(dāng)時迷迷糊糊看完了《J...
摘要:所以,當(dāng)我們使用時,不能進(jìn)行復(fù)雜數(shù)據(jù)類型的判斷,因為它調(diào)用的是,雖然也繼承自,但在上重寫了,而我們通過實際上是通過原型鏈調(diào)用了。 關(guān)于 toString 方法在有關(guān)js的開發(fā)中使用應(yīng)該是相當(dāng)廣泛的,這兩天在看jQuery的源碼,從 toString 本身了解與鞏固了不少知識,寫出來與大家一同分享。首先先上一段代碼: var arr=[1,2,3]; toString.call(arr)...
閱讀 2246·2023-04-25 20:45
閱讀 1136·2021-09-22 15:13
閱讀 3709·2021-09-04 16:48
閱讀 2635·2019-08-30 15:53
閱讀 992·2019-08-30 15:44
閱讀 1030·2019-08-30 15:43
閱讀 1068·2019-08-29 16:33
閱讀 3491·2019-08-29 13:08