js中關於this的指向和js原型的一些經驗

2021-10-04 03:26:29 字數 3682 閱讀 4574

通過以下例子來觀察this的指向,以及得出的結論

console.

log(

this

)function

test()

this.f2

=function()

fun()}

this.f3

=()=>

fun()}

this.f4

=()=>

test()

}fun()

}}//通過new test函式 例項乙個test物件 js物件都是由函式構建的 此例的當前物件是v1

let v1=

newtest()

//加不加括號都行

/* 1.this不能賦值

2.this預設指向window物件

3.函式屬性如果是使用function宣告的函式,那麼this指向的就是指定函式構造的當前物件

4.使用function宣告的函式中this指向window物件,除了函式屬性 由f2()的this輸出可得知(test,window)

5.簡頭函式中的this指向最近的上下文中的this 由f4()的this輸出可得知(test,window),第乙個this最近的上下文是test函式,test函式中this指向的是當前物件,第二個this的上下文是fun函式,由結論4可得this指向的是window物件

*/v1.f2(

)v1.f3(

)v1.f4(

)/*

3.函式屬性如果是使用function宣告的函式,那麼this指向的就是指定函式構造的當前物件 此例物件是v1

5.簡頭函式中的this指向最近的上下文中的this,v1是test物件,所以,tset簡頭函式最近的上下文是test函式,test函式指向當前物件也就是v1

以下f2賦值等同於在test函式中

this.f2=function()

tset()

}*/v1.f2

=function()

tset()

}v1.f2(

)/*

5.簡頭函式中的this指向最近的上下文中的this 這裡是window

*/v1.f2=

()=>

v1.f2

()

輸出結果如下:

總結如下

1.this不能賦值

2.this預設指向window物件

3.函式屬性如果是使用function宣告的函式,那麼this指向的就是當前物件

4.使用function宣告的函式中this指向window物件,除了函式屬性

5.簡頭函式中的this指向最近的上下文中的this

再看乙個例子,加深印象

再看看原型的規則

1.物件預設存在的__proto__物件屬性這個物件的原型

2.物件的__proto__物件屬性預設是構建當前物件函式的prototype物件屬性

3.物件屬性也是ojbect型別物件(那麼也就是由object函式構造的物件)由結論2可得普通物件(new object/ )的原型是object.prototype

4.物件找不到的屬性就會去自身的__proto__(原型)物件屬性尋找,原型物件屬性本身也是物件它會找自身的__proto__物件屬性,直到乙個__proto__物件是object物件,這個物件的__proto__(原型)也就是object.prototype,物件的這個查詢過程就是原型鏈。

5.object.prototype物件屬性是原型鏈的終點,因為object.prototype物件的__proto__屬性是null

6.物件的__proto__物件屬性不是object型別的物件,是指定函式型別的物件,這個物件的原型就是乙個object物件。

原型其實很簡單,原型鏈就是js物件的__proto__屬性一種查詢關係,看兩個例子吧8

如上個例子的v1物件列印結果如下所示

v1的原型鏈如下所示

首先,v1是個test物件,然後test物件的建構函式是test函式,所以v1的原型是test.prototype。

其次,test.prototype自身也是個object,那麼object物件的建構函式是object函式,所以test.prototype的原型是object.prototype

test=>test.

__proto__

(test.prototype)

=>test.prototype.

__proto__

(object.protoytp)

=>object.prototype.

__proto__

(null

)

再看乙個例子

首先,(new array)是個array物件,然後array物件的建構函式是array函式,所以array物件的原型(proto)是array.prototype,array.prototype本身也是個arrray物件(帶字串下標的陣列物件無論多長都是0),但它也是__proto__物件屬性,按照理論6,array.prototype是乙個不是object型別的物件,它的原型就是乙個object物件。

array=>array.

__proto__

(array.

prototype

(new

array

(array方法都在這裡了如splice..)

))=>array.prototype.

__proto__

(object.prototype)

=>object.prototype.__proto__=>

null

陣列也是object物件是物件就可以隨便生成新屬性,array函式就提供了乙個length屬性,其它啥也沒有。陣列也是object物件,但是在語法概念上還是不一樣的。必竟乙個是乙個是{}。

這是我的乙個總結,可能不完全對,js的原型太繞了

真要用js原型的話就用class算了,不管了直接上普通語言的oop

class

student

hello()

}class

primarystudent

extends

student

mygrade()

}

關於js中的this指向問題

1.在普通函式和全域性環境下 this指向window function demo demo console.log this x 102.建構函式 建構函式就是函式new出來的物件,所以this指向該物件 function foo var foo newfoo console.log foo.x ...

關於JS中this的指向問題

例項在方法中,this 指的是所有者物件。單獨的情況下,this 指的是全域性物件。在函式中,this 指的是全域性物件。在函式中,嚴格模式下,this 是 undefined。在事件中,this 指的是接收事件的元素。this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到...

js中關於this指向的解答

function person person 輸出此時this的指向是並不是person,而是 window 因為函式也是window物件裡面的,因此輸出的是window。var name 小明 var person person.showname 輸出小紅此時的this指向person物件 fun...