Javascript理解this對象

來源:互聯網
上載者:User

標籤:pre   obj   log   code   var   運行   原型   .com   調用   

this是函數運行時自動產生的一個內部對象,只能在函數內部使用,但總指向調用它的對象。

通過以下幾個例子加深對this的理解。

(1)作為函數調用

var name = ‘Jenny‘;function person() {    return this.name;}console.log(person());  //Jenny

上面這個例子在全域範圍中調用person(),此時的調用對象為window,因此this指向window,在window中定義了name變數,因此this.name相當於window.name,為Jenny。

再看下面一個例子:

function a() {    function b() {        function c() {            console.log(this);        }        c();    }    b();}a();    // window

這個例子中,也同為函數調用,因此this指向window。

(2)作為對象的方法調用

var name = ‘Jenny‘;var obj = {    name: ‘Danny‘,    person: function() {        return this.name;    }};console.log(obj.person());  //Danny

在這個例子中,person()函數在obj對象中定義,調用時是作為obj對象的方法進行調用,因此此時的this指向obj,obj裡面定義了name屬性,值為Danny,因此this.name = "Danny"。

(3)作為建構函式調用

作為建構函式調用和普通函數調用的區別是,建構函式使用new關鍵字建立一個執行個體,此時this指向執行個體對象。

function person() {    return new person.prototype.init();}person.prototype = {    init: function() {        return this.name;    },    name: ‘Brain‘};console.log(person().name); //undefined

這是一個比較複雜的例子,涉及到了原型。

首先,建立建構函式person,為函數重新定義原型,在原型上定義了兩個方法init和name,其中init返回this.name。

調用person函數的name屬性,發現返回的是undefined,為什麼不是Brain呢?

我們看,調用person,返回person.prototype.init()的一個執行個體,假設返回的這個執行個體名為a,那麼此時的this指向的就是a,a作為person.prototype.init()的一個執行個體,那麼所有定義在person.prototype.init()中的方法等都可以被a調用,但是name屬性定義在person的原型中,而非init函數中,因此返回undefined。

(4)apply和call

使用apply()和call()可以改變調用函數的對象,第一個參數為改變後調用這個函數的對象,其中apply()的第二個參數為一個數組,call的第二個參數為每個參數。

function person() {    return this.name;}var obj = {    name: ‘Jenny‘,    age: 18};console.log(person.apply(obj));  //Jenny

使用apply函數改變了調用person的對象,是在obj對象下面調用person,不再是在window對象下調用了,因此this指向obj,this.name = "Jenny";

文章標題:Javascript理解this對象
轉載自https://www.cnblogs.com/nuanriqingfeng/p/5794632.html
標籤:js,this對象

Javascript理解this對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.