通過以下例子來觀察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...