Javascript 使用自己的方法创建函数
我一直在关注一个关于JS中的链接列表的优秀文章。我遇到一个带有“点”符号的函数,就好像它在向函数添加属性或方法一样。我不知道这是怎么回事,这里是代码片段。() 我的问题主要在第2行:Javascript 使用自己的方法创建函数,javascript,Javascript,我一直在关注一个关于JS中的链接列表的优秀文章。我遇到一个带有“点”符号的函数,就好像它在向函数添加属性或方法一样。我不知道这是怎么回事,这里是代码片段。() 我的问题主要在第2行: List.makeNode = function(){} 下面是一行文字,描述这行代码的作用: 我们还需要一种简单的方法来创建节点,一种可能的方法是 为构造函数函数列表提供makeNode方法:如果 在您看来,函数也是一个对象并且可以 具有方法和属性。这种方法类似于提供 类或静态方法和属性 我理解构造函数的概念。
List.makeNode = function(){}
下面是一行文字,描述这行代码的作用:
我们还需要一种简单的方法来创建节点,一种可能的方法是
为构造函数函数列表提供makeNode方法:如果
在您看来,函数也是一个对象并且可以
具有方法和属性。这种方法类似于提供
类或静态方法和属性
我理解构造函数的概念。在最后一行代码中,我调用了构造函数List();使用new关键字生成包含对象的var列表:
{ start: null,
end: null,
add: [Function]
}
此外,如果我将“List.makeNode”(在我的List()构造函数的第2行)替换为“this.makeNode…”,我正在创建的var List对象将具有makeNode函数作为List对象上的方法:
{ makeNode: [Function],
start: null,
end: null,
add: [Function]
}
我知道List()最终是一个对象,并且最终继承了Object.prototype的所有内容。此List()对象/构造函数包含:
{ [Function: List] makeNode: [Function] }
我真的不知道这是怎么回事
- makeNode是列表对象上的属性/方法,它也包含 列表功能李>
- 为什么我们必须让makeNode与List关联
- 将列表更改为“this”并拥有makeNode有什么大不了的吗 函数是否在“List()”的每个新实例上执行
谢谢 这可能是个错误
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(){ };
或者,如果它应该是实例的公共方法
function List(){
this.makeNode = function(){ };
/* */
}
function List(){
/* */
}
List.prototype.makeNode = function(){ };
可能是个错误
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(){ };
或者,如果它应该是实例的公共方法
function List(){
this.makeNode = function(){ };
/* */
}
function List(){
/* */
}
List.prototype.makeNode = function(){ };
makeNode是List对象上的一个属性/方法,它也包含List函数吗
它只是列表
函数中的一个属性。每个函数都是一个对象,因此可以像处理其他对象一样为函数指定属性
但是,将赋值放在构造函数中是一种奇怪的、没有必要的操作。“静态方法”应在构造函数创建后分配给它:
function List () {
// ...
}
List.makeNode = function() {
// ...
};
为什么我们必须让makeNode与List关联
你会怎么做?您可以只定义一个独立函数,如function makeNode(){…}
,但由于该函数仅用于创建列表,因此以某种方式将其与List
关联是有意义的
将List改为“this”并在“List()”的每个新实例上都使用makeNode函数,这有什么大不了的吗
这意味着,每个而不是列表
都有自己的makeNode
副本。由于函数本身不依赖于任何特定于实例的属性,因此不需要这样做
您可以将该方法分配给List.prototype
,但它看起来不像List
实例需要访问该函数,因此没有理由将其放在那里
makeNode是List对象上的一个属性/方法,它也包含List函数吗
它只是列表
函数中的一个属性。每个函数都是一个对象,因此可以像处理其他对象一样为函数指定属性
但是,将赋值放在构造函数中是一种奇怪的、没有必要的操作。“静态方法”应在构造函数创建后分配给它:
function List () {
// ...
}
List.makeNode = function() {
// ...
};
为什么我们必须让makeNode与List关联
你会怎么做?您可以只定义一个独立函数,如function makeNode(){…}
,但由于该函数仅用于创建列表,因此以某种方式将其与List
关联是有意义的
将List改为“this”并在“List()”的每个新实例上都使用makeNode函数,这有什么大不了的吗
这意味着,每个而不是列表
都有自己的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);
两个答案实际上都很好 如果我可以为它们添加一点,创建类列表的简单方法如下
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);
+1,虽然你可以强调一点,“列表对象”是他个人所说的“列表函数”,但我只是将其作为列表构造函数的局部函数。没有明显的理由让它在外部可见。将其作为构造函数的一个属性似乎是出于教学原因而无偿做的事情。我猜是意见问题。+1,不过你可以再强调一点,“列表对象”就是他所说的“列表函数”