設定建構函式的 prototype 為 null,例項proto的指向?

時間 2021-06-09 15:49:24

1樓:紫雲飛

強答一波,雖然題主的問題已經解決了。題主現在看規範最好不要再看 ES5 了,雖然 ES5 的確是簡單點。這個問題的話看 ES5 勉強也夠了,但以後遇到 ES5 之後的知識點該怎麼辦?

新規範的話,對應的章節在這裡 ECMAScript 2018 Language Specification。

另外,class 型別的函式的 prototype 屬性是唯讀的,因為沒有理由再去改它了:

class

Person

extends

Object

{}Object

.getOwnPropertyDescriptor(Person

,"prototype"

).writable

// false

2樓:小貝殼

諮詢了一位高人,自答一下吧。

Annotated ES5 第7條

If Type(proto) is not Object, set the [[Prototype]] internal property of obj to the standard built-in Object prototype object as described in 15.2.4.

就是說,在通過 new 關鍵字來建立乙個物件的時候,會檢視 Persion.prototype 是不是乙個物件,如果不是的話,就設定為 Object.prototype

如果你想讓 Persion 沒有原型鏈,可以 var person = Object.create(null)

Object.create的執行步驟可以看15.2.3.5吧 :

Annotated ES5

Set the [[Prototype]] internal property of obj to O.

Object

.create

(null

)等價於:

varobj

=new

Object

();obj

.__proto__

=null;

建構函式不能是虛函式

ylq 建構函式不是不能是虛函式,而是完全沒意義。c 在編譯期間就能確定你要建立的物件的具體型別,而這個具體型別包含了什麼,繼承了什麼在編譯期間也是明確的,所以要構造什麼也都是明確的,根本沒必要存在虛建構函式。虛函式的存在是因為編譯期間沒法確定具體呼叫物件,才會有虛函式,虛函式表這麼個東西。 雞賊軒...

C 的建構函式與析構函式?

關於C 的問題,你的心中要有兩個概念,乙個是記憶體的分配,二是記憶體的初始化。C 的建構函式有兩個作用 第一,你必須要有乙個建構函式,compiler才會去給你分配記憶體。第二,分配了記憶體之後,再用建構函式去初始化記憶體。函式體為空,因為類中的每乙個成員都有預設建構函式和析構函式 否則是無法編譯的...

C Java 預設建構函式?

編譯器只有當需要建構函式的時候才會建立預設建構函式。詳細可以參閱 深度探索C 物件模型 摘抄一點 以下四種情況,編譯器會合成預設的建構函式 第一,class 有member object 該member object有default constructor class需要default constr...