js 給p標籤賦值 關於JS原型鏈的那點事

2021-10-13 16:24:56 字數 2023 閱讀 6018

在講述原型鏈繼承之前,我建議大家能夠先去看看《詳解js中函式、函式原型和函式例項之間的關係》這篇文章,這樣有助於大家理解js原型鏈繼承的原理,因為這篇文章是基於上篇文章來講述的,如果你讀完了,那麼我們就來看看下面這張圖:

如上圖所示:personal物件想要繼承main物件,則通過將main的例項賦值給personal 的原型物件:

personal.prototype = new main () ;
如此personal原型物件 就能通過main物件的例項中的[[prototype]]來訪問到main原型物件中的屬性和方法了,而此時大家注意,personal 原型物件則與personal 函式斷開了聯絡,因為personal 原型物件被重新賦值了,所以還需要重新將personal 函式personal原型物件重新建立聯絡:

personal.prototype.constructor = personal ;
function main () {}main.prototype.*** = '男' ;main.prototype.eat = function () function personal () {}personal.prototype.name = 'hwk';personal.prototype.sayname = function () // 繼承personal.prototype = new main();personal.prototype.constructor = personal;var p = new personal();console.log(p.*** ) ; // 男console.log(p.name) ; // undefinedp.eat(); // main eat ...p.sayname (); // uncaught typeerror:p.sayname is not a function
執行如上**你會發現p.nameundefined,p.sayname這個方法沒找到,原因在於我們後面重新賦值了personal.prototype = new main();因此找不到一開始定義在personal.prototype上的name屬性和sayname方法,因此在使用原型鏈繼承的時候,要在繼承之後再去在原型物件上定義自己所需的屬性和方法。

// 先繼承personal.prototype = new main();personal.prototype.constructor = personal;// 後定義屬性和方法personal.prototype.name = 'hwk';personal.prototype.sayname = function () // 正確輸出console.log(p.*** ) ; // 男console.log(p.name) ; // hwkp.eat(); // main eat ...p.sayname (); // personal name
此時personal的例項已經可以訪問到父類main原型物件中的方法和屬性了,這也就是原型鏈繼承的方式,希望對大家有幫助!

ps:在原型物件上定義屬性和方法,其所有的建構函式例項都能共享原型上的屬性和方法,因此如果某乙個建構函式例項物件修改了原型物件上的屬性值和方法,則也會影響其他例項物件。

JS 物件 JS原型 原型鏈

參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...

js 原型與原型鏈

5條原型規則 1.所有的引用型別 陣列 物件 函式 都具有物件特性,即可自由擴充套件屬性 除了 null 除外 2.所有的引用型別 陣列 物件 函式 都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件。3.所有的函式,都有乙個prototype 顯式原型 屬性,屬性值也是乙個普通的物件。4...

JS原型物件,原型鏈

js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...