關於原型陷阱的乙個總結

2021-08-30 04:40:42 字數 1602 閱讀 1107

function person(name)

person.prototype.sayname=function()

var person1=new person('tom');

person1.sayname(); //tom

person.prototype.constructor===person; //true

person.prototype= years old.`);}}

person1.sayname(); //tom

person1.age; //undefined

person1.greet(); //typeerror: person1.greet is not a function

var person2=new person('mary');

person2.age; //21

person2.sayname(); //typeerror: person2.sayname is not a function

// 以上解決的是重定義原型物件時導致的例項指向問題

// 以下是原型上的constructor屬性指向錯誤問題,此問題雖然不影響實際操作,但會導致無法通過constructor確定物件型別

person.prototype.constructor===person; //false

object.getprototypeof(person); //ƒ object() object建構函式

person1.constructor===person; //true

person2.constructor===person; //false

//正確做法是在上方重定義原型之後,就直接對其進行糾正

//亦可在重定義的原型內部對constructor屬性進行賦值,但如此會導致其enumerable屬性為true

//原生預設是false,雖然目前沒發現有什麼其他影響,但最好不要修改原生屬性的描述符

//因此最好的辦法就是在外部宣告

person.prototype.constructor=person;

person2.constructor===person; //true

問題描述:

使用物件字面量方法重新定義物件原型或令其指向現有的自定義物件時,出現的constructor指向問題,和,舊物件仍能訪問舊原型但無法訪問新原型屬性的情況

原因:

constructor屬性僅屬於原型物件,例項化的物件可以通過__proto__鏈結進行訪問,但此鏈結僅指向原型物件,而不指向建構函式(高程是這麼翻譯的,但我覺得不容易理解。看後續配圖的意思其實是,__proto__鏈結預設指向例項被定義時的原型物件,但如果人為的重定義原型物件,其實等同於新建乙個物件。因此舊的例項在原型物件被重定義後仍能訪問舊原型上的屬性,但此時如果新例項化乙個物件,則一切正常)

解決辦法:

在重定義原型物件後,直接對其constructor屬性進行人為的重新繫結。

(僅從避免原型陷阱方面考慮,如果加入繼承因素,還有別的方法可以避免,後面再總結)

Vue的乙個陷阱

最近做專案,上線前一直有個bug,不知道是什麼原因引起的,vm.set needverification true verification button prop disabled true verification button addclass verification disab needv...

關於C 中getline 函式的乙個陷阱

最近寫 的時候遇到乙個問題,就是getline函式接受標準輸入 鍵盤 時,失效了。請先看 include include include using namespace std int main 執行時沒問題的,先輸入乙個數字,再輸入你的名字,讓我們試試,結果如下 讀者可以自己動手試試,會發現還沒有...

關於C 中getline 函式的乙個陷阱

最近寫 的時候遇到乙個問題,就是getline函式接受標準輸入 鍵盤 時,失效了。請先看 include include include using namespace std int main 執行時沒問題的,先輸入乙個數字,再輸入你的名字,讓我們試試,結果如下 讀者可以自己動手試試,會發現還沒有...