簡體   English   中英

用自己的方法創建函數

[英]Creating a Function with its own methods

我一直在遵循關於JS中鏈表的出色指南 我遇到了一個帶有“點”符號的函數,好像它在向函數添加屬性或方法一樣。 我不知道這是如何工作的這是代碼片段。 repl.it鏈接

function List(){
    List.makeNode = function(){
        return {
            data: null,
            next: null
        };
    };
    this.start = null;
    this.end = null;

    this.add = function(data){
        if(this.start === null){
            this.start = List.makeNode();
            this.end = this.start;
        } else {
            this.end.next = List.makeNode();
            this.end = this.end.next;
        }
        this.end.data = data;
    };
}

var list=new List();

我的問題主要在第2行:

List.makeNode = function(){}

這是描述此代碼行功能的文本行:

我們還需要一種簡單的方法來創建節點,一種可能的方法是為構造函數提供List的makeNode方法:如果您覺得這很奇怪,請記住,函數也是對象並且可以具有方法和屬性。 此方法類似於提供類或靜態方法和屬性。

我了解構造函數的概念。 在我的最后一行代碼中,我調用構造函數List();。 使用new關鍵字生成包含對象的var列表:

{ start: null, 
  end: null, 
  add: [Function] 
}

此外,如果我將“ List.makeNode”(位於List()構造函數的第2行)替換為“ this.makeNode ...”,則我正在創建的var列表對象將具有makeNode函數作為列表對象上的方法:

{ makeNode: [Function], 
  start: null, 
  end: null, 
  add: [Function] 
}

我了解List()最終是一個對象,並最終繼承了Object.prototype的所有內容。 該List()對象/構造函數包含:

{ [Function: List] makeNode: [Function] }

我真的不知道這是怎么回事。

  • makeNode是列表對象(也包含列表函數)上的屬性/方法嗎?
  • 為什么我們必須保持makeNode與List關聯?
  • 將List更改為“ this”並在“ List()”的每個新實例上都具有makeNode函數,這有什么大不了的嗎?

我對我們為什么要使用List.makeNode,將其存儲在何處以及為什么以這種方式實現它感到迷茫。

謝謝!

可能是個錯誤。

function List(){
    List.makeNode = function(){ };
    /* */
}
List.makeNode;    // undefined
new List();       // This creates List.makeNode method
List.makeNode;    // function
new List();       // This recreates List.makeNode method

每次創建實例時都沒有必要重置構造函數的方法(除非您希望訪問最后創建的實例的數據,否則不是這樣)。

如果makeNode確實應該是List方法,那么更好的方法是

function List(){
    /* */
}
List.makeNode = function(){ };

或者,如果它應該是實例的特權方法,

function List(){
    this.makeNode = function(){ };
    /* */
}

或者,如果它應該是實例的公共方法,

function List(){
    /* */
}
List.prototype.makeNode = function(){ };

makeNode是列表對象(也包含列表函數)上的屬性/方法嗎?

它只是List函數的一個屬性。 每個函數都是一個對象,因此您可以像對其他每個對象一樣將屬性分配給該函數。

但是將賦值放入構造函數很奇怪,這是不必要的。 創建后,應將“靜態方法”分配給構造函數:

function List () {
  // ...
}

List.makeNode = function() {
   // ...
};

為什么我們必須保持makeNode與List關聯?

您會怎么做? 您可以定義一個獨立的函數,例如function makeNode() { ... }函數,但是由於該函數僅用於創建列表,因此以某種方式將其與List關聯是有意義的。

將List更改為“ this”並在“ List()”的每個新實例上都具有makeNode函數,這有什么大不了的嗎?

這意味着每個而不是List都有自己的makeNode 副本 由於函數本身不依賴於任何實例特定的屬性,因此不必這樣做。

可以將方法分配給List.prototype ,但是仍然看起來好像List實例不需要訪問該函數,因此沒有理由將其放置在那里。

這兩個答案實際上都很好。

如果我可以向他們添加一點,創建類列表的簡單方法就是這樣

var List = (function () {
    function List() { /*Your Constructor*/ };
    List.prototype.add = function () { /*this is a method on each object*/ };
    List.makeNode = function() { /*Static method on Class List*/ };

})();

var myList = new List();
var myNode = List.makeNode();
/* Do something with the node */
myList.add(myNode);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM