摘要:一規范中二規范中三規范中四分析過程分析五證明流程
Why in JavaScript both "Object instanceof Function" and "Function instanceof Object" return true? 一、ECMA5.1規范中instanceof
/* how instanceof is defined by ECMA 5.1 Specification: The production RelationalExpression: RelationalExpression instanceof ShiftExpression is evaluated as follows: Let lref be the result of evaluating RelationalExpression. Let lval be GetValue(lref). Let rref be the result of evaluating ShiftExpression. Let rval be GetValue(rref). If Type(rval) is not Object, throw a TypeError exception. If rval does not have a [[HasInstance]] internal method, throw a TypeError exception. Return the result of calling the [[HasInstance]] internal method of rval with argument lval. ------->Not all objects will have [[HasInstance]] internal method, but functions. console.log(Object instanceof {}); TypeError: Expecting a function in instanceof check, but got二、ECMA5.1規范中[[HasInstance]]
/* how [[HasInstance]] has been defined in the ECMA 5.1 specification: Assume F is a Function object. When the [[HasInstance]] internal method of F is called with value V, the following steps are taken: If V is not an object, return false. Let O be the result of calling the [[Get]] internal method of F with property name "prototype". If Type(O) is not Object, throw a TypeError exception. Repeat Let V be the value of the [[Prototype]] internal property of V. If V is null, return false. If O and V refer to the same object, return true. ------->Take the prototype property of F and compare it with the [[Prototype]] internal property of O until it becomes null or prototype of F is the same as O. */三、ECMA5.1規范中[[prototype]]
/* what is the [[prototype]] internal property: All objects have an internal property called [[Prototype]]. The value of this property is either null or an object and is used for implementing inheritance. Whether or not a native object can have a host object as its [[Prototype]] depends on the implementation. Every [[Prototype]] chain must have finite length(that is, starting from any object, recursively accessing the [[Prototype]] internal property must eventually lead to a null value). ------->We can get this internal property with the Object.getPrototypeOf function */
/* [[HasInstance]] also talks about another property called prototype, which is specific to the Function objects. The value of the prototype property is used to initialise the [[Prototype]] internal property of a newly created object before the Function object is invoked as a constructor for that newly created object. ------->when a function object is used as a constructor, a new object will be created and the new object will have its internal [[Prototype]] initialized with this prototype property ------->function Test() {} Test.prototype.print = console.log; console.log(Object.getPrototypeOf(new Test()) === Test.prototype); # true */ console.log("-------------------------------------------------------" + " ");四、分析過程
//分析: console.log(Object instanceof Function); // true // It will fetch Function.prototype first and it will try // and find if that object is in the prototype hierarchy of Object. Let us see how that turns out console.log(Function.prototype); // [Function: Empty] console.log(Object.getPrototypeOf(Object)); // [Function: Empty] console.log(Object.getPrototypeOf(Object) === Function.prototype); // true //Since the Function.prototype matches the Object"s internal property [[Prototype]], it returns true console.log(Function instanceof Object); // true console.log(Object.prototype); // {} console.log(Object.getPrototypeOf(Function)); // [Function: Empty] console.log(Object.getPrototypeOf(Function) === Object.prototype); // false console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function))); // {} Object.getPrototypeOf(Object.getPrototypeOf(Function)) === Object.prototype // true //Here, first we get the Object.prototype, which is {}. // Now it is trying to find if the same object {} is there in the Function"s prototype chain. // Immediate parent of Function is and Empty function. console.log(Object.getPrototypeOf(Function)); // [Function: Empty] //It is not the same as Object.prototype console.log(Object.getPrototypeOf(Function) === Object.prototype); // false //But the [[HasInstance]] algorithm doesn"t stop there. It repeats and gets up one more level console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function))); // {} //And this is the same as Object.prototype. That is why this returns true. console.log("-------------------------------------------------------" + " ");五、證明流程
console.log(Object instanceof Function); // true console.log(Function instanceof Object); // true console.log(Object.prototype); // {} console.log(Object.getPrototypeOf(Function)); // [Function: Empty] console.log(Object.getPrototypeOf(Function) === Object.prototype); // false console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function))); //{} console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function)) === Object.prototype); // true console.log(Object.getPrototypeOf(Function)); //[Function: Empty] console.log(Object.getPrototypeOf(Function) === Object.prototype); // false console.log(Object.getPrototypeOf(Object.getPrototypeOf(Function))); // {} console.log("-------------------------------------------------------" + " ");
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/101182.html
摘要:另一方面,我不建議初次接觸的開發人員閱讀規范。在維護語言的最新規范。在這一點上,我想指出的是,絕對沒有人從上到下閱讀規范。拓展閱讀由于的定義,中的細節如冒泡錯誤,直到塊在規范中不存在。換句話說,會轉發中拋出的錯誤,并終止其余的步驟。 翻譯自:How to Read the ECMAScript Specification Ecmascript 語言規范 The ECMAScr...
摘要:,微軟發布,同時發布了,該語言模仿同年發布的。,公司在瀏覽器對抗中沒落,將提交給國際標準化組織,希望能夠成為國際標準,以此抵抗微軟。同時將標準的設想定名為和兩類。,尤雨溪發布項目。,正式發布,并且更名為。,發布,模塊系統得到廣泛的使用。 前言 作為程序員,技術的落實與鞏固是必要的,因此想到寫個系列,名為 why what or how 每篇文章試圖解釋清楚一個問題。 這次的 why w...
摘要:不包括作為其嵌套函數的被解析的源代碼。作用域鏈當代碼在一個環境中執行時,會創建變量對象的一個作用域鏈。棧結構最頂層的執行環境稱為當前運行的執行環境,最底層是全局執行環境。無限制函數上下文。或者拋出異常退出一個執行環境。 前言 其實規范這東西不是給人看的,它更多的是給語言實現者提供參考。但是當碰到問題找不到答案時,規范往往能提供想要的答案 。偶爾讀一下能夠帶來很大的啟發和思考,如果只讀一...
摘要:本文總結了的各種情況,并從規范的角度探討了的具體實現,希望對大家理解有所幫助。規范規范里面詳細介紹了的實現細節,通過閱讀規范,我們可以更準確的理解上述四種情況到底是怎么回事。由于本人能力有限,如有理解錯誤的地方還望指出。 this是面向對象編程中的一個概念,它一般指向當前方法調用所在的對象,這一點在java、c++這類比較嚴格的面向對象編程語言里是非常明確的。但是在javascript...
摘要:在上百種語言中算是命好的一個,還有就是最近納入高考體系的。由以下三個部分構成。就是對實現該標準規定的各個方面內容的語言的描述。是針對但經過擴展的用于的應用程序編程接口。將頁面映射為由節點構成的樹狀結構。 JavaScript的歷史這里就不再贅述了,當然JavaScript的歷史還是比較有意思的。在上百種語言中JavaScript算是‘命’好的一個,還有就是最近納入高考體系的python...
閱讀 3690·2021-11-22 15:24
閱讀 1593·2021-09-26 09:46
閱讀 1904·2021-09-14 18:01
閱讀 2601·2019-08-30 15:45
閱讀 3526·2019-08-30 14:23
閱讀 1866·2019-08-30 12:43
閱讀 2915·2019-08-30 10:56
閱讀 800·2019-08-29 12:20