因為proto而產生的instanceof問題

2021-09-24 07:35:23 字數 1176 閱讀 2698

最近有了解下new的實現原理,發現乙個關於instanceof的問題。

function foo(name,age) 

function

createclass

()let obj = createclass(foo,'zl')

console.log(obj instanceof foo) // false

複製**

我又去了解了下instanceof的實現,原始碼沒找到,只是在網上找到了原理

function instanceoftest(left, right) 

}console.log(instanceoftest(obj, foo) // true

複製**

現在問題就出現了,肯定是new或者instanceof實現有問題,才導致這種情況,最後,我上stack overflow請求幫助,才明白問題出在__proto__上面。作為例項物件的乙個隱藏屬性,在不同瀏覽器上的表現形式不一樣,而且,通過__proto__並沒有真正修改了例項物件obj的原型鏈,只是修改了原型屬性。因此,通過es5提供的標準方法來獲取真正的原型鏈上的原型會發現

console.log(object.getprototypeof(obj)) //null

複製**

因此,對自定義的new和instaceof進行簡單的改造即可:

function

createclass

()function instanceoftest(left, right)

}console.log(obj instanceof foo) // true

複製**

null 與 {}

這乙個問題的產生不是__proto__相容問題,object.create(null)建立的物件,本身為原型鏈頂層,不再包含object原型鏈上的屬性以及下一層的原型鏈。那麼使用物件屬性__proto__僅僅為null物件的屬性賦值,並未建立原型鏈,intanceof遍歷原型鏈上找不到對應的原型。通過系統方法setprototypeof為null物件賦值原型屬性__proto__,同時將null物件的原型指向該原型鏈。因此,僅僅將object.create(null) 替換為{}同樣可以解決instanceof失敗問題

MSSQL因為資料型別而產生的效能問題。

還是最近出現的問題。有個表已經達到百萬級的數量了。最近不知道為什麼,不定時地發生造成整個資料庫很慢。這個表的改做索引的地方都做了。但是還是不定時地慢。經過分析。問題出現在。有個字段id,是int。但是如果使用的人輸入乙個超長的整數的時候,就會出現以上問題。如 select from table wh...

分布式鎖解決因為刪鎖而產生的兩種問題

設定鎖過期時間,訪問資料庫後刪除鎖。涉及的兩種問題都是毫秒級別的問題,為了減輕伺服器的壓力,一般在大廠裡要完善的 而小公司裡,則不需要這麼麻煩,不設計刪除鎖,直接等待過期時間過去自動刪除鎖。這樣就省去了因為刪除鎖產生的一系列問題。分布式鎖的兩種問題 第一種問題 鎖過期,刪除鎖,把別人的刪了 第1條執...

程式設計時,容易因為粗心而引發的錯誤

1 二維陣列初始化問題 int a 10 10 正確 a 10 10 錯誤,和初始化區別開,需要表示式對其賦值。2 陣列初始化時維數一定要是大於或者等於1的常量表示式 int a 錯誤 int b 10 int c b 錯誤,必須要是常量 const int sz get size int d ge...