我一直关注JS中链接列表的优秀guide。我遇到了一个带有'dot'表示法的函数,好像它正在为函数添加一个属性或方法。我不知道这是如何工作的这里是代码片段。 (repl.it link)
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(){}
以下是描述这行代码正在做什么的文本行:
我们还需要一种简单的方法来创建节点,其中一种可能的方法是 使用makeNode方法提供构造函数List:如果是这样 你回忆起一个函数也是一个对象而且可以 有方法和属性。这种方法类似于提供 类或静态方法和属性。
我理解构造函数的概念。在我的最后一行代码中,我调用了构造函数List();使用new关键字生成包含对象的var列表:
{ start: null,
end: null,
add: [Function]
}
此外,如果我用'this.makeNode ...'替换'List.makeNode'(我的List()构造函数的第2行)'我创建的var list对象将makeNode函数作为方法列表对象:
{ makeNode: [Function],
start: null,
end: null,
add: [Function]
}
我理解List()最终是一个Object,最终继承了Object.prototype中的所有东西。这个List()对象/构造函数包含:
{ [Function: List] makeNode: [Function] }
我真的不知道这是怎么回事。
我很遗憾为什么我们使用List.makeNode存储它,以及为什么以这种方式实现它。
谢谢!
答案 0 :(得分:3)
可能,这是一个错误。
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(){ };
答案 1 :(得分:3)
makeNode是List对象上的属性/方法,它还包含List函数吗?
它只是List
功能的属性。每个函数都是一个对象,因此您可以像处理所有其他对象一样为函数指定属性。
但是将赋值放在构造函数中是奇怪的,这是不必要的。 "静态方法"应该只在创建后分配给构造函数:
function List () {
// ...
}
List.makeNode = function() {
// ...
};
为什么我们必须将makeNode与List相关联?
你会做什么?你可以定义一个独立的函数,比如function makeNode() { ... }
,但由于该函数仅用于创建列表,因此以某种方式将它与List
相关联是有意义的。
将List改为'这个'是一件大事吗?并在' List()'?
的每个新实例上都有makeNode函数
这意味着每个而非List
都有自己的副本 makeNode
。由于函数本身不依赖于任何特定于实例的属性,因此这样做是不必要的。
你可以将方法分配给List.prototype
,但是,它看起来不像List
实例需要访问该功能,所以有没理由把它放在那里。
答案 2 :(得分:0)
实际上两个答案都非常好。
如果我可以为它们添加一点,创建类列表的简单方法就是这样
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);