在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ javascript關(guān)于this的一個問題

javascript關(guān)于this的一個問題

function Person(){
  this.say = function(){
    console.log("Hello");
  };
}
var person = new Person();
person.say();

這應(yīng)該是一個奇怪的問題,為什么可以通過person.say的方式訪問say方法。
好像把this去掉,就不能正常輸出結(jié)果了。這個this有什么作用。

我在判斷this指代誰的時候總會告訴自己誰調(diào)用指代誰,而這次,this直接出現(xiàn)在了say前面,我有點糊涂了,感覺自己沒辦法表達清楚自己的問題。

回答
編輯回答
終相守

1.new操作符的作用是把后面的函數(shù)當做構(gòu)造函數(shù),創(chuàng)造一個對象,然后把this指針指向這個對象,同時返回這個對象
2.所以這里的this就是指向new出來的對象,如果去掉了this,那么這個方法就不屬于new出來的對象,而只屬于Person這個函數(shù)的內(nèi)部作用域,外部訪問不了

2017年10月19日 09:51
編輯回答
念舊

先來看一段 ES6 class 語法的例子

class Person {
    say() {
        console.log("hello");
    }
}

const person = new Person();
person.say();

上面這是采用 class 語法定義的 Person 類,它有一個 say() 方法。運行效果和題主的代碼運行效果一致,但本質(zhì)上還是有些區(qū)別。這段代碼里看不到 this,而 say() 方法也不是定義在 Person 的每個實例對象上,而是定義在 Person 的原型對象中。

如果要把題主的代碼翻譯成 class 語法,應(yīng)該是這樣:

class Person {
    constructor() {
        this.say = function() {
            console.log("hello");
        };
    }
}

const person = new Person();
person.say();

這里出現(xiàn)了 constructor,即構(gòu)造函數(shù)。構(gòu)造函數(shù)中,通過 this 指針對實例對象添加了一個 say() 方法。如果有多個實現(xiàn),每個實例都有自己的 say() 方法實例,雖然行為一樣,但卻是不同的對象,可以驗證一下

class Person {
    constructor() {
        this.say = function() {
            console.log("hello");
        };
    }
}

const person = new Person();
const p2 = new Person();
console.log(person.say === p2.say);
// false

這里提到了構(gòu)造函數(shù)。在 ES6 以前,需要定義 JavaScript 類,就是通過構(gòu)造函數(shù)來定義的,然而實際上,構(gòu)造函數(shù)和普通函數(shù)在定義上并沒有多大區(qū)別,當調(diào)用的時候使用了 new 運算符,就是構(gòu)造,沒使用,就是普通函數(shù) 參閱:JavaScript 的 this 指向問題深度解析。

OOP 語言在產(chǎn)生對象的時候一般都是這么一個過程:產(chǎn)生一個對象,從最遠的基類開始依次調(diào)用變量初始化(如果有的話)和構(gòu)造函數(shù),所以調(diào)用構(gòu)造函數(shù)的時候,已經(jīng)存在對象,this 指針已經(jīng)生效,可以在構(gòu)造函數(shù)中使用 this 指針。對于靜態(tài)語言來說,可以通過 this 指針訪問已經(jīng)定義的屬性,或者方法。而 JavaScript 是動態(tài)語言,所以甚至可以使用 this 指針賦予它新的屬性,比如 this.say = ....,當這個屬性是一個函數(shù)表達式的時候,就相當于是在定義新的實例方法(非常確切的實例方法,每個實例一個,各自不同)。

最后,既然是方法,那就可以使用 對象.方法() 的形式來調(diào)用,也就是 person.say()。如果沒有定義,當然也就不能調(diào)用了,也就是題主說的沒效果(實際應(yīng)該報錯)

2017年12月20日 16:52
編輯回答
茍活

這個問題很好!這個問題其實闡述了javascript十分核心的知識點:面向?qū)ο缶幊?/code>。從三個方面說說面向?qū)ο缶幊蹋?code>對象、構(gòu)造函數(shù)、new 命令。

一、對象

對象是單個實物的抽象,也可以說是一個容器,里面包含對象屬性和對象方法。

二、構(gòu)造器

構(gòu)造函數(shù)是專門用來生成對象的函數(shù)。
function Person() {...}。這里Person函數(shù)其實就是一個構(gòu)造函數(shù)!其中構(gòu)造函數(shù)一般有兩個特點:1、構(gòu)造函數(shù)體內(nèi)部使用了this關(guān)鍵字,代表了所要生成的對象實例。2、用new命令生成對象。

三、new 命令

new命令的作用,就是執(zhí)行構(gòu)造函數(shù),返回一個實例對象。
var person = new Person();這里通過new命令,讓構(gòu)造函數(shù)Person生成了一個實例對象,并保存在變量person中,這個新生成的實例對象,從構(gòu)造函數(shù)Person繼承了say方法,new命令執(zhí)行時,構(gòu)造函數(shù)內(nèi)部的this,就代表了新生成的實例對象,this.say表示實例對象有一個say方法。如果去掉this,say方法就變成了局部方法,外部是無法調(diào)用的。
2018年1月12日 18:44