js中 proto 和prototype的區別和關係?

時間 2021-05-06 11:09:06

1樓:

這個問題屬於js原型知識點,我是這樣理解js的原型的:

先區分主體,再辨別指向。

主體可以分為:

建構函式

原型建構函式new出來的例項

指向:1.建構函式和原型是相互指向的關係,建構函式.prototypes指向原型,原型.construtor指向建構函式

2.例項._proto_指向原型

3.例項._proto_等於建構函式.prototypes 都是原型知道這幾點你就可以理解其他答案的圖了

2樓:龍之母風暴降生

換個簡單說法

所有的函式都指向(__proto__)Function.prototype

所有的原型都指向(__proto__)Object.prototype

所有例項都指向(__proto__)自己建構函式的prototype

3樓:鄭國棟

給我自己寫的兩篇文章做一下廣告吧。

相信會讓你更容易明白 prototype和__proto__是在幹嘛。

鄭國棟:圖紙和金鑰:形象地解釋js的構造和繼承機制 (一)鄭國棟:圖紙和金鑰:形象地解釋js的構造和繼承機制 (二)

4樓:無無無無

不請自來,簡單畫了張圖,望指正

Foo是普通函式,藍色線是__proto__的流向,橘色線是prototype的流向,兩根紅色線是需要特別注意的地方;

總結:__proto__指向構造自己的函式的原型物件,所有物件的__proto_最終都指向Object的原型物件,然後再指向null;所有函式的__proto__都指向Function函式的原型物件,包括它本身

函式的prototype指向自己的原型物件,原型物件的constructor指向對應的函式;

比較神奇的存在:Function.prototype==Function.

__proto_;Object.__proto__.__proto__==Object.

prototype

typeof(null)="object",這個看有的大神說null不是object,還沒查證。。。

5樓:blairzhao111

可以看成下面的公式 (Type 由 function 定義):

(instance of Type).__proto__ = Type.prototype

注:不能涵蓋所有 corner cases

6樓:喝粥拉肚子

function a(){};

var b = new a();

console.log(b.__proto__ === a.prototype)//true

var c = Object.create(a);

console.log(c.__proto__ === a.prototype)//false

var person1 = new Object();

var person2 = Object.create(person1);

console.log(person2.__proto__ === person1) //true

console.log(person2.__proto__ === person1.prototype) //false

function a是乙個建構函式

new出來的物件.__proto__指向的是建構函式的原型,而不是建構函式。繼承來的屬性和方法也都是繫結在建構函式的原型上的,也就是a.

prototype上的。

var c = Object.create(a); 表示的是以a為原型建立乙個物件,那麼物件.__proto__ 就應該指向a(這個原型),c想要從a上繼承的屬性和方法都要寫在a裡面。

__proto__ 是每個物件都有的屬性,但是prototype 只有方法才有。

建構函式的原型中的constructor指向構造器,如下:

a.prototype.constructor == a //true

7樓:九木旭

首先來批評一下這張圖吧,畫的真差,看睡著了,醒過來才看懂

我們給它標個序號,來分析一下

舉個例子

第一步:

`s1.__proto__===Student.prototype`

第二步:

這一步沒有誰等於誰,誰指向誰

第三步:

`Student.prototype.__proto__ === Object.prototype`

第四步:

`Student.__proto__ === Function.prototype`

第五步:

這一步沒有誰等於誰,誰指向誰

第六步:

`Object.__proto__ === Function.prototype`

第七步:

這一步沒有誰等於誰,誰指向誰

第八步:

`Function.prototype.__proto__ === Object.prototype`

總結一下

* 物件的__proto__指向它的建構函式原型;

* 只有函式物件才同時有__proto__和prototype,他們的__proto__指向他們的父級或者Function.prototype,

而它prototype的不指向到誰,是被指向的,也就是__proto__是獲取物件原型的連線符,而prototype就是原型;

* 函式物件的原型的__proto__指向的是它父級的原型

* 物件的__proto__最終都指向到Object.prototype,而Object.prototype的__proto__指向了null,這不是無中生有,我想,Object的原型一定有很多方法,它是個超級物件,它不需要爸爸了

8樓:六耳

子物件.__proto__ === 父函式.prototype (只有函式存在prototype )

a.constructor === A === A.prototype.constructor

prototype是函式預設的乙個屬性,它指向乙個物件,這個物件的constructor屬性指向函式本身.

__proto__ 同 .constructor 一樣是 prototype 的屬性(更準確的說是乙個getter setter)

他們並不存在於你當前正在使用,操作的物件中而是和其他的常用函式一樣存在於Object.prototype 中. 只是繫結了當前的this

3. Object.getPrototypeOf(a) === a.__proto__ // true

4. 乙個物件的__proto__ 屬性和自己的內部屬性[[Prototype]]指向乙個相同的值 (通常稱這個值為原型),原型的值可以是乙個物件值也可以是null(比如說Object.prototype.

__proto__的值就是null).

該屬性可能會引發一些錯誤,因為使用者可能會不知道該屬性的特殊性,而給它賦值,從而改變了這個物件的原型. 如果需要訪問乙個物件的原型,應該使用方法Object.getPrototypeOf.

firefox、chrome等瀏覽器把物件內部屬性[[Prototype]]用__proto__的形式暴露了出來.

附加: 使用原型鏈去模擬類是不夠優雅的推薦使用物件關聯去實現功能

關於原型鏈 - 梧正的部落格 | Xiaosa's Blog

9樓:崮生

剛讀一遍mdn關於原型的文件,在這裡說一下自己的認知,望指正js 中基本每個物件都有__proto__屬性然後一些特殊的物件即函式,函式物件有乙個屬性叫做prototype其次通過 new 關鍵字可以通過乙個函式建立乙個物件如:function fun()

那麼剛才建立的obj就也可以呼叫這一方法了:obj.hello()__proto__則到底是個什麼呢?

它就是物件的建構函式的prototype,即obj.__proto__===obj.constructor.prototype

而obj的建構函式是fun

也就是obj.__proto__===fun.prototype

10樓:

prototype是函式才有的,指向它的原型。

__proto__是每個object都有的,指向他的原型鏈上的parent。

11樓:Sir丶z

所有物件都有__proto__屬性,函式這個特殊物件除了具有__proto__屬性,還有特有的原型屬性prototype。prototype物件預設有兩個屬性,constructor屬性和__proto__屬性。prototype屬性可以給函式和物件新增可共享(繼承)的方法、屬性,而__proto__是查詢某函式或物件的原型鏈方式。

constructor,這個屬性包含了乙個指標,指回原建構函式。

prototype和__proto__都指向原型物件,任意乙個函式(包括建構函式)都有乙個prototype屬性,指向該函式的原型物件。同樣任意乙個建構函式例項化的物件都有乙個__proto__屬性(__proto__並非標準屬性,ECMA-262第5版將該屬性或指標稱為[[Prototype]],可通過Object.getPrototypeOf()標準方法訪問該屬性),指向建構函式的原型物件。

foo.__proto__ === Object.getPrototypeOf(foo) //true

foo, Object.getPrototypeOf(obj) 返回物件obj的原型。

.__proto__ === foo. constructor.prototype //true,大多數情況下

特別的,使用Object.create時,資料:Object.create()

var a1 =

var a2 = Object.create(a1);

a2.__proto__ === a1; //true

構造器最終指向 Function, __proto__ 最終指向 Object.prototype 進而指向null

12樓:wengmlang

js小白,花了很長時間研究「玄學」__proto__和prototype,尤其是Function、Object和他們的」__proto__和prototype,總結了一些。

最之間的方法就是舉例說明:

//建立乙個建構函式Car

letCar

=function

()//new乙個例項

letvan

=new

Car();

//這時就有 van =

這時有建構函式Car和例項van,他們之間的關係如圖:

注意的是__proto__指的就是原型委託,所以A.__proto__ === B 等價於 Object.getPrototypeOf(A) === B.

任何函式其實都是由建構函式Function構造出來的,有:

letfn

=function

(){}

//等價於

letfn

=new

Function

()//這和

letob={}

//等價於

letob

=new

Object

()//一樣

所以有:

js中 aaa style 和 aaa getAttribute style 等價嗎,有無區別?

淡夏的綠茶 IE6 7下 elem.getAttribute style 和 elem.style 返回的都是 CSSStyleDeclaration 物件。這是個BUG,在IE8之後已經被修復了。elem.getAttribute style 返回的是元素的style屬性上css文字 如果有點話,...

js中 abc 和new String abc 有什麼區別啊?

刃舞 資料型別的區別,乙個是字串,乙個是物件 你能將 string 這種基本型別像物件一樣使用是因為 js 有基本包裝型別這個概念,運算時會為字串建立個 String 例項來運算,而字串本身不參與運算,但這個包裝的例項只在運算時存在,運算後就會被銷毀 之所以這麼做只是為了使用方便,語法糖,你不能因為...

JS 中 object array map set 等底層資料結構是什麼?

加爾靈斯 這個問題很複雜啊 所有js物件都是基於乙個名為HeapObject的類生成的。生成物件的時候,引擎通過這個類向Heap申請空間。這個分配過程基本都是引擎自己實現,而不會呼叫malloc,因為要實現精確GC 物件的儲存結構就是分為幾塊,乙個頭部資訊,乙個屬性塊,存的是k v值形式的集合,乙個...