9. 構造函數(shù)

2018-02-24 16:11 更新
  • 9.1?總是使用?class。避免直接操作?prototype?。

    為什么? 因為?class?語法更為簡潔更易讀。

      // bad
      function Queue(contents = []) {
        this._queue = [...contents];
      }
      Queue.prototype.pop = function() {
        const value = this._queue[0];
        this._queue.splice(0, 1);
        return value;
      }
    
      // good
      class Queue {
        constructor(contents = []) {
          this._queue = [...contents];
        }
        pop() {
          const value = this._queue[0];
          this._queue.splice(0, 1);
          return value;
        }
      }
  • 9.2?使用?extends?繼承。

    為什么?因為?extends?是一個內建的原型繼承方法并且不會破壞?instanceof。

      // bad
      const inherits = require('inherits');
      function PeekableQueue(contents) {
        Queue.apply(this, contents);
      }
      inherits(PeekableQueue, Queue);
      PeekableQueue.prototype.peek = function() {
        return this._queue[0];
      }
    
      // good
      class PeekableQueue extends Queue {
        peek() {
          return this._queue[0];
        }
      }
  • 9.3?方法可以返回?this?來幫助鏈式調用。

    // bad
    Jedi.prototype.jump = function() {
      this.jumping = true;
      return true;
    };
    
    Jedi.prototype.setHeight = function(height) {
      this.height = height;
    };
    
    const luke = new Jedi();
    luke.jump(); // => true
    luke.setHeight(20); // => undefined
    
    // good
    class Jedi {
      jump() {
        this.jumping = true;
        return this;
      }
    
      setHeight(height) {
        this.height = height;
        return this;
      }
    }
    
    const luke = new Jedi();
    
    luke.jump()
      .setHeight(20);
  • 9.4?可以寫一個自定義的?toString()?方法,但要確保它能正常運行并且不會引起副作用。

    class Jedi {
      constructor(options = {}) {
        this.name = options.name || 'no name';
      }
    
      getName() {
        return this.name;
      }
    
      toString() {
        return `Jedi - ${this.getName()}`;
      }
    }
以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號