js實現call,apply,new方法

2021-10-21 02:15:23 字數 1974 閱讀 8673

讓我們先看看new做了什麼事情

(1).建立了乙個物件

(2).使新建的物件的__proto__指向了建構函式的原型物件prototype

(3).使建構函式中的內部屬性指向新建的物件

(4).返回乙個物件

知道new做了哪些事情後就好辦了

function

mynew

(fn,

...arg)

//使新建的物件的__proto__指向了建構函式的原型物件prototype

obj.__proto__=fn.prototype

//使建構函式中的內部屬性指向新建的物件

var obj1=fn.

call

(obj,

...arg)

//這裡必須返回乙個物件

return

typeof obj1 ===

'object'

?obj1:obj

}

例1.
function

person

(name)

var child1=

mynew

(person,

'xinlan'

)var child2=

newperson

('xinlan'

)

例2.
function

person

(name)

}var child1=

mynew

(person,

'xinlan'

)var child2=

newperson

('xinlan'

)

先讓我們看看call做了什麼事情

(1).判斷this的指向,第乙個入參不為空時指向第乙個入參,為空時則指向window

(2).改變函式的this指向

(3).返回函式呼叫結果

function.prototype.

mycall

=function

(obj,

...arg)

var name=

'xinlan'

function

getname

(age)

}var obj=

getname.

mycall

(obj,

18)

先讓我們看看call做了什麼事情

(1).判斷this的指向,第乙個入參不為空時指向第乙個入參,為空時則指向window

(2).改變函式的this指向

(3).返回函式呼叫結果

function.prototype.

=function

(obj,arg)

//判斷this的指向,第乙個入參不為空時指向第乙個入參,為空時則指向window

obj=obj?obj:window

//改變函式的this指向

obj.fn=

this

//呼叫函式

var fn

if(arg)

else

//這裡一定要刪除不刪除obj物件會多乙個fn屬性

delete obj.fn

//返回結果

return fn

}var name=

'xinlan'

function

getname

(age)

}var obj=

getname.

(obj,[18

])

有**不對的地方歡迎各位大佬指教,謝謝!!

JS實現爬蟲 原生js實現Ajax

為什麼要用js抓取資料?有的 的安全性比較好,不能破解登入的限制,使用js可以繞開登入的限制。實現方法 使用google chrome登入抓取站的使用者賬號,在console執行js指令碼即可。例項抓取 賣家商品分類 var cat data url function init function f...

JS實現繼承

1.使用物件冒充實現繼承 該種實現方式可以實現多繼承 實現原理 讓父類的建構函式成為子類的方法,然後呼叫該子類的方法,通過this關鍵字給所有的屬性和方法賦值 function parent firstname function child firstname var mychild new chi...

js實現繼承

通過修改原型的指向實現的繼承,雖然實現了繼承,但是繼承後的例項物件的屬性值都是一樣的 都是 zs,20,男 只有自己定義的屬性值不一樣。使用這種方式實現的繼承,不能繼承父類的方法,只能繼承父類的屬性。方式一 var obj1 通過這種方式只是讓obj2指向了和obj1相同的一塊位址空間,記憶體中只有...