我正在尝试使用工厂函数的方式来实现一个对象,并尝试使用链表示例,其中我初始化一个空链表然后尝试添加节点,在add方法中我设置头部如果它未设置,否则将节点添加到链中的最后一个节点。 问题是头部似乎永远不会被设置,任何想法为什么?
"use strict"
const niceLog = s => {
console.log(JSON.stringify(s, null, 2))
}
function linkedList() {
let head
const node = data => {
return {
data,
next: null
}
}
const add = data => {
if (!head) {
head = node(data)
} else {
const end = node(data)
let n = head
while (n.next) n = n.next
n.next = end
}
}
const del = data => {
let n = head
if (n.data === data) head = head.next
while (n.next) {
if (n.next.data === data) {
n.next = n.next.next
return
}
n = n.next
}
}
return {
head,
add,
del
}
}
const ll = linkedList()
ll.add('cheese')
ll.add('crackers')
ll.add('tea')
ll.add('coffee')
niceLog(ll) // {}
这是es6类语法中的等效代码,它确实有效,(我听说工厂函数更好,因为它们避免了新的问题,并且这些关键字没有正确设置,这就是为什么我试图使用工厂函数)
const niceLog = s => {
console.log(JSON.stringify(s, null, 2))
}
class Node {
constructor(data) {
this.data = data
this.next = null
}
}
class LinkedList {
constructor() {
this.head = null
}
add(data){
if (!this.head) {
this.head = new Node(data)
} else {
const end = new Node(data)
let n = this.head
while (n.next) n = n.next
n.next = end
}
}
del(data) {
let n = this.head
if (n.data === data) this.head = this.head.next
while (n.next) {
if (n.next.data === data) {
n.next = n.next.next
return
}
n = n.next
}
}
}
const ll = new LinkedList()
ll.add('cheese')
ll.add('crackers')
ll.add('tea')
ll.add('coffee')
niceLog(ll) // output =
"head": {
"data": "cheese",
"next": {
"data": "crackers",
"next": {
"data": "tea",
"next": {
"data": "coffee",
"next": null
}
}
}
}
}
答案 0 :(得分:2)
评论太长了。你似乎很困惑一个工厂的功能'是在JavaScript中。工厂函数不表示您避免使用this
关键字。这确实意味着您避免使用new
关键字:
let myFactoryPrototype = {
someMethod: function() {
return this.foo;
}
};
let myFactory = () => Object.create(myFactoryPrototype);
let myObject = myFactory(); // no 'new'
注意常规和箭头函数语法的混合。我使用过this
并不重要的箭头函数,以及它常用的旧function
。如果您想避免this
然后不使用方法,请使用对数据类型进行操作的常规(可能是纯粹的)函数:
const addToLinkedList = (list, node) => {
// code return a new list with the extra node goes here
};
但实际上,在JavaScript中避免使用this
是很困难的,你真的在削减谷物。另一方面,避免使用new
非常简单,只需使用Object.create
或对象文字即可。