JS重寫原型

2021-09-25 03:51:00 字數 1643 閱讀 2338

對於乙個類,它天生自帶乙個屬性:prototype。但是有時候,我們會重寫類的原型。

比如,在繼承的時候,我們想通過原型讓子類b繼承父類a的原型上的屬性和方法(公有繼承公有)。

functiona(

)a.prototype.

say=

function()

;functionb(

)b.prototype =

a.prototype;

var b =

newb

;console.

log(b.say)

;//=>輸出say函式體

通過b.prototype = a.prototype;讓子類b的原型重新指向乙個位址。

對於內建類(如object)的原型,瀏覽器為了保護裡面的內建方法,是不允許重新建立乙個堆記憶體覆蓋原有的。

object.prototype =};

console.

log(object.prototype)

;//輸出原來的object.prototype

注:在ie瀏覽器中,瀏覽器禁止使用__proto__這個屬性(本身存在,只不過被保護起來了,不允許使用)
我們手動建立乙個新的記憶體給fn.prototype,此時,這個手動建立的prototype是不會預設自帶constructor屬性的(使用instanceof運算子就無法找到例項物件所屬的類了)。

重寫原型,會把之前瀏覽器預設建立的prototype覆蓋,所以之前在原型上的方法和屬性都不存在了,需要恢復。

恢復類預設原型上的屬性和方法:

functionfn(

)fn.prototype.b=

function()

var pro = fn.prototype;

fn.prototype =

, c:

function()

, recover:

function()

}}fn.prototype.

recover()

;//執行後恢復

var f =

newfn;f.

b();

//=>1

注意兩點:

1)for in迴圈能遍歷物件中所有的屬性和方法(私有+公有),但對於瀏覽器內建的一些屬性(如constructor__proto__等),無法用for in遍歷獲取,這是瀏覽器對內建屬性和方法的乙個保護。

2)在recover方法中,為了防止還原時原有的方法將自定義原型方法的覆蓋,最好修改自定義方法名。優化recover方法

recover:

function()

this

[key]

= pro[key];}

}var f =

newfn;f.

b();

//=>1

f.my_b()

;//=>2

js重寫原型問題

首先先引入一道題 function a a.prototype function var x new a do x 的值是 這裡有四個選項 bar報錯fooundefined一開始可能會選擇bar,因為看起來重寫原型了。答案是foo.因為這裡原型被重寫了,切斷了原型和例項之間的關係。來看一下控制台 ...

JS原型物件重寫問題

function person var friend new person 新建乙個person例項 重寫person的原型 person.prototype friend.sayname 返回結果是undefined var friend new person 重寫原型物件後新建person的例項...

JS 物件 JS原型 原型鏈

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