无法在JavaScript中将Prototype函数写为函数声明。为什么?

时间:2018-01-22 12:10:52

标签: javascript

为什么我们不能像函数声明一样编写原型函数:

只允许在函数表达式中使用:



       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.




3 个答案:

答案 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;