1. 程式人生 > 其它 >Hadoop單節點偽分散式環境部署

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本質沒有其他的兩個方法,但是必須要攜帶,所以程式碼會變成冗餘,所以一般在原型上新增方法