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值形式的集合,乙個...