Hadoop單節點偽分散式環境部署
關於函式的呼叫有很多種,比如直接圓括號執行,陣列或者物件列舉執行,定時器呼叫,DOM事件處理函式呼叫。隨著呼叫函式方式不同, 所以函式上下文也就不同
還有另外這一種呼叫函式的方式,使用new 關鍵字呼叫
比如下面的程式碼
function fun() { console.log("hello"); } new fun();
new 關鍵字呼叫函式會發生下面四步走
1> 函式裡面會祕密建立一個新的空物件
2> this上下文指向這個新建立的空物件
3> 執行函式中所有的語句
4> 返回這個新物件
比如下面的程式碼
function Person(name, age, sex) {this.name = name; this.age = age; console.log(this,'this') } var xiaoming = new Person("小明", 18); console.log(xiaoming,'xiaoming');
new關鍵字建立的函式就叫做建構函式
new出來的結果就是建構函式的例項
構造有什麼好處?
此時我們可以多建立幾個例項
function Person(name, age, sex) { this.name = name;this.age = age; } var xiaoming = new Person("小明", 18); var xiaohong = new Person("小紅", 17); var xiaogang = new Person("小剛", 20); console.log(xiaoming,'xiaoming'); console.log(xiaohong,'xiaohong'); console.log(xiaogang,'xiaogang');
會發現他們擁有同樣的屬性群,稱他們為同一類物件
new關鍵字呼叫的函式,此時都會返回同一類物件,感覺是在構造什麼東西,此時這個函式我們稱之為建構函式
- 如果一個函式是建構函式,不是因為函式本身的執行能力,而是因為被new 關鍵字呼叫了
- 預設首字母大寫的函式,都知道該函式就是建構函式,如果首字母不大寫,也不影響建構函式的功能
- 建構函式能構造同一類物件,例項都擁有同樣的屬性群
- 被建構函式new出來的物件我們叫做建構函式的例項
因為JavaScript是沒有類的概念的(es6之前)所以JavaScript是基於面向物件的,此時我們可以模仿其他語言,把精髓移植過來。比如我們可以當上面Person函式中的Person視作個類(class),被new出來的
xiaoming就是是這個Person類的例項(instance)
例項呼叫方法會發生的問題
給Person類新增兩個屬性(name,age),每一個例項也可以有自己的方法。
此時呼叫函式寫法就是 例項.方法(),因為例項本身就是一個物件,所以此時呼叫該方法的時候方法內部的this上下文就是這個物件
function Person(name, age, sex) { this.name = name; this.age = age; this.sayHello = function () { console.log(this,this.name+'的this') console.log( "你好,我是" + this.name + ",今年" + this.age + "歲了," ); }; } var xiaoming = new Person("小明", 18); var xiaohong = new Person("小紅", 17); var xiaogang = new Person("小剛", 20); xiaoming.sayHello(); xiaohong.sayHello(); xiaogang.sayHello();
此時會發現,函式的上下文指向非常清楚,不會發生混亂,輸出的都是該物件自己的上下文,規則2:物件打點呼叫函式的時候上下文就是這個物件,所以每一個this都是該例項本身
每一個例項本身都有一個sayHello函式
此時判斷一下當前這些函式是否相等
console.log(xiaogang.sayHello === xiaohong.sayHello)
此時輸出的是false,因為本質上是建構函式給每一個例項都新增另一個相同功能的函式,僅僅只是函式的功能相同,本質上不是一個函式
但是此時就會發現一個問題,因為函式本質就是提高複用性的,如果每一次建立一個例項的時候都新增一個函式,此時函式的複用性就被違背了,並且還會增加其他不屬於自己的會用到的函式
比如我們有一個People類,這個類是描述所有的人類的職業方法,比如有程式設計師的方法xiedaima,比如有建築師的方法是zaofangzi,比如有醫生的方法是jiuren;如果此時我們建立一個chengxuyuan的例項,此
時這個例項不得不擁有不符合它的其他方法,並且一輩子都用不到
比如我們的建構函式會是這樣
function People(name, age, sex) { this.name = name; this.age = age; this.sex = sex; // 程式設計師所用到的方法 this.xiedaima = function () {}; // 建築師所用到的方法 this.zoafangzi = function () {}; // 醫生所用到的方法 this.jiuren = function () {}; } var chengxuyuan = new People('小明', 24, '男') console.log(chengxuyuan)
此時看上圖會發現chengxuyuan本質沒有其他的兩個方法,但是必須要攜帶,所以程式碼會變成冗餘,所以一般在原型上新增方法