通過call和new 的原理來理解經典繼承

2021-09-25 21:29:34 字數 1855 閱讀 4023

call可以改變乙個函式的作用域

let a =};

let b =

;a.fn.

call

(b);

// 輸出 bar

實現乙個自己的call
// 在函式的原型上定義自己的call

function.prototype.

mycall

=function

(context)

// 獲取引數

let args =

[...arguments]

.slice(1

);// 將要呼叫的方法新增到新作用域

context.fn =

this

;// 在新作用域執行方法

let result = context.fn(

...args)

;delete context.fn;

// 要呼叫的方法如果沒有返回 result = undefined

return result;

}

從**中可以看出,call實際就是將要呼叫的方法新增到新作用域,並執行。

new 運算子建立乙個使用者定義的物件型別的例項或具有建構函式的內建物件的例項。

new用來建立物件

function

person

(name, age)

person

('xm',12

);// this指向window

let me =

newperson

('xg',18

);// this指向me

console.

log(me.age)

;// 輸出18

實現乙個自己的new
function

mynew

(fun)

;// 執行建構函式

// 根據前面的call原理,建構函式的this指向obj

// 執行完建構函式,obj擁有name,age屬性

fun.

call

(obj,

...arguments)

;// 返回該物件

return obj;}}

let she =

mynew

(person)

('xh',16

)//

// mynew(person) = newreturn

// mynew(person)('xh', 16) = newreturn('xh', 16)

function

rectangle

(length,width)

rectangle.prototype.

getsize

=function()

function

square

(edgelength)

}// 建立乙個空物件 obj

// 將 obj.__proto__ = rectangle.prototype

// obj 作為新的上下文執行建構函式

// 返回obj————新的例項

let rect =

newrectangle(3

,4);

console.

log(rect.

getsize()

);let square =

newsquare(5

);console.

log(square.

getsize()

);

經典繼承也有自身的缺點

ret和call的原理

1.ret 指令用棧中的資料,修改ip的內容,從而實現近轉移 cpu執行ret指令時,進行下面兩步操作 1 ip ss 16 sp 使用棧頂元素修改ip實現跳轉 2 sp sp 2 2.retf 用棧中的資料,修改cs和ip的內容,從而實現遠轉移 cpu執行retf指令時,進行下面四步操作 1 ip...

New和delete的原理

new和delete的原理 當我們在程式中寫下 new 和 delete 時,我們實際上呼叫的是 c 語言內建的 new operator 和 delete operator.所謂語言內建就是說我們不能更改其含義,它的功能總是一致的。以 new operator 為例,它總是先分配足夠的記憶體,而後...

關於call的使用和原理分析

call 方法使用乙個指定的this值和單獨給出的乙個或多個引數來呼叫乙個函式。var obj window.a 100var b obj.b b 100 b.call obj 1 function.call thisarg,arg1,arg2,thisarg 可選的。在 function 函式執行...