为什么我们不能像函数声明一样编写原型函数:
只允许在函数表达式中使用:
function SinglyLinkedList() {
this.head = null;
this.tail = null;
}
SinglyLinkedList.prototype.add = function(data){
console.log(data);
} // working as expected
function SinglyLinkedList.prototype.add(data){
console.log(data);
}
// showing error.

答案 0 :(得分:2)
因为这不是语法的设计方式。也许可以以这种方式设计,但事实并非如此。 function declaration中的名称(更确切地说,绑定标识符)必须与Identifier的定义匹配,这意味着它不能是属性路径比如SinglyLinkedList.prototype.add
。
请注意,如果您正在寻找更短的内容,可以使用Object.assign
(新的,但可填充的)和使用方法语法的对象初始值设定项(从ES2015开始的新版本):
Object.assign(SinglyLinkedList.prototype, {
add(data) {
console.log(data);
},
remove(/*...*/) {
// ...
}
// etc.
});
或者对于ES2015之前的环境(使用Object.assign
的polyfill),属性语法而不是方法语法:
Object.assign(SinglyLinkedList.prototype, {
add: function(data) {
console.log(data);
},
remove: function(/*...*/) {
// ...
}
// etc.
});
当然,ES2015 +有class
,它比旧方式更简洁。
答案 1 :(得分:2)
在function
关键字后,您可以编写函数名称。函数名称必须符合有效的命名约定。 .
在函数名称中无效,使语法无效。
function
关键字并非设计用于在嵌套对象上创建函数。它唯一的工作就是创建一个函数,它不关心你之后把它放在哪里。
答案 2 :(得分:-1)
第二种方法在JS中没有语法上的有效性
将命名函数分配给原型的一种可能方法:
function add(data) {
...
}
SinglyLinkedList.prototype.add = add;