JS中__proto__與prototype的區(qū)別
JS中__proto__和prototype是兩個(gè)與原型相關(guān)的屬性,它們?cè)诠δ苌仙杂胁煌1疚膶⒕唧w介紹并比較這兩者的區(qū)別,并提供相應(yīng)的代碼示例。
首先,我們先來(lái)了解一下它們的含義和用途。
proto__proto__是對(duì)象的一個(gè)內(nèi)置屬性,它用于指向該對(duì)象的原型。每個(gè)對(duì)象都有一個(gè)__proto__屬性,包括自定義對(duì)象、內(nèi)置對(duì)象和函數(shù)對(duì)象。通過(guò)__proto__屬性,我們可以訪(fǎng)問(wèn)和操作對(duì)象的原型鏈。
讓我們來(lái)看一個(gè)例子:
let obj = {};
console.log(obj.__proto__); // 輸出:Object {}
let arr = [];
console.log(arr.__proto__); // 輸出:Array []
function func() {}
console.log(func.__proto__); // 輸出:[Function]
上面的代碼中,我們創(chuàng)建了一個(gè)空對(duì)象obj,并訪(fǎng)問(wèn)了它的__proto__屬性。可以看到,obj.__proto__指向了一個(gè)Object{}對(duì)象。同樣,我們還創(chuàng)建了一個(gè)空數(shù)組arr,并訪(fǎng)問(wèn)了它的__proto__屬性,結(jié)果是arr.__proto__指向了一個(gè)Array []對(duì)象。而對(duì)于函數(shù)對(duì)象func來(lái)說(shuō),它的__proto__指向的是一個(gè)[Function]對(duì)象。
起來(lái),__proto__屬性用于指向?qū)ο蟮脑停覀兛梢酝ㄟ^(guò)它來(lái)訪(fǎng)問(wèn)和操作原型鏈。
prototypeprototype是函數(shù)對(duì)象獨(dú)有的屬性,它指向了一個(gè)原型對(duì)象。每個(gè)函數(shù)對(duì)象都有一個(gè)prototype屬性,但它只有在這個(gè)函數(shù)作為構(gòu)造函數(shù)使用時(shí)才有意義。
我們來(lái)看一個(gè)示例:
function Person() {}
console.log(Person.prototype); // 輸出:Person {}
上面的代碼中,我們定義了一個(gè)Person函數(shù)對(duì)象,并訪(fǎng)問(wèn)了它的prototype屬性。可以看到,Person.prototype指向了一個(gè)Person{}對(duì)象。
prototype屬性的主要作用是在構(gòu)造函數(shù)模式下,用于構(gòu)建實(shí)例對(duì)象的原型鏈。當(dāng)我們使用構(gòu)造函數(shù)來(lái)創(chuàng)建一個(gè)對(duì)象時(shí),它的__proto__屬性會(huì)指向構(gòu)造函數(shù)的prototype屬性。
let person = new Person();
console.log(person.__proto__ === Person.prototype); // 輸出:true
上面的代碼中,我們使用了Person構(gòu)造函數(shù)來(lái)創(chuàng)建了一個(gè)對(duì)象person。結(jié)果表明,person.__proto__指向了Person.prototype。
區(qū)別和聯(lián)系__proto__和prototype都與對(duì)象的原型相關(guān),它們之間的聯(lián)系和區(qū)別如下:
下面的代碼示例用于進(jìn)一步說(shuō)明這兩者的區(qū)別與聯(lián)系:
function Animal() {}
Animal.prototype.eat = function() {
console.log("Animal is eating");
};
function Dog() {}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {
console.log("Dog is barking");
};
const dog1 = new Dog();
dog1.eat(); // 輸出:Animal is eating
dog1.bark(); // 輸出:Dog is barking
console.log(dog1.__proto__ === Dog.prototype); // 輸出:true
console.log(Dog.prototype.__proto__ === Animal.prototype); // 輸出:true
上面的代碼中,我們通過(guò)定義Animal構(gòu)造函數(shù)和Dog構(gòu)造函數(shù),創(chuàng)建了一個(gè)繼承關(guān)系。通過(guò)__proto__和prototype屬性,我們可以訪(fǎng)問(wèn)到對(duì)象的原型鏈,并且證明了它們之間的聯(lián)系。
綜上所述,__proto__和prototype在JS中都與原型相關(guān),但在功能和使用方式上有所不同。了解它們的區(qū)別可以幫助我們更好地理解JS中的原型機(jī)制,并在編寫(xiě)代碼時(shí)更靈活地利用它們。
相關(guān)推薦
-
js內(nèi)置對(duì)象是什么意思
js內(nèi)置對(duì)象是指在JavaScript中已經(jīng)預(yù)定義好的對(duì)象,可以直接在代碼中使用的對(duì)象。這些對(duì)象提供了豐富的功能和方法,方便開(kāi)發(fā)者進(jìn)行各種操作和處理。在JavaScript中,有許多內(nèi)置對(duì)象可以使用,
-
js有哪些內(nèi)置對(duì)象類(lèi)型
JavaScript是一種廣泛應(yīng)用于網(wǎng)頁(yè)開(kāi)發(fā)的腳本語(yǔ)言,它有許多內(nèi)置對(duì)象類(lèi)型,這些內(nèi)置對(duì)象類(lèi)型提供了各種方法和屬性,用于處理不同的數(shù)據(jù)類(lèi)型和執(zhí)行特定的任務(wù)。本文將介紹JavaScript的一些常見(jiàn)的內(nèi)
-
在Java中,new關(guān)鍵字的主要作用是實(shí)例化一個(gè)對(duì)象
Java中new操作符的作用是用于創(chuàng)建一個(gè)類(lèi)的實(shí)例對(duì)象。它通過(guò)調(diào)用類(lèi)的構(gòu)造方法來(lái)實(shí)現(xiàn)對(duì)象的創(chuàng)建和初始化。在Java中,當(dāng)需要使用類(lèi)的方法和屬性時(shí),必須先創(chuàng)建該類(lèi)的對(duì)象。使用new操作符可以在內(nèi)存中為對(duì)
-
函數(shù)式編程有什么優(yōu)點(diǎn)
函數(shù)式編程有什么優(yōu)點(diǎn),需要具體代碼示例函數(shù)式編程(Functional Programming)是一種編程范式,它將計(jì)算機(jī)程序視為一系列數(shù)學(xué)函數(shù)的組合。函數(shù)式編程強(qiáng)調(diào)使用純函數(shù)(Pure Functi
-
JS中bind函數(shù)的作用
JS中bind函數(shù)的作用,需要具體代碼示例在JavaScript中,我們經(jīng)常需要處理函數(shù)的上下文(即函數(shù)內(nèi)部的this指向)。而bind()函數(shù)就是用來(lái)改變函數(shù)的上下文,并返回一個(gè)新的函數(shù)。bind(















