[英]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] }
我真的不知道這是怎么回事。
我對我們為什么要使用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.