[英]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.