js的函数与对象有一个不明白的地方

函数可以理解为需要重复执行的代码块。不同的地方可以进行传参。
构造函数加new关键字似乎可以起到函数相似的作用。
我想问的是,函数与构造函数+对象这两种有什么相同点和不同点。
什么时候使用函数?什么时候使用构造函数+对象的形式。

阅读 2k
2 个回答

关于“构造函数+对象”,你其实缺的是有关“类”的知识,关于这个,我在求问js 中的类究竟是什么意思?已经答过,自己阅读吧

补充:

如果你懂“类”是什么,那这个问题本来就不应该存在了。秉承好人做到底的原则,还是简单说两句吧。

虽然无论函数,还是类都讲求单一职责,但显然力度不同。当我们使用函数时,通常希望这个函数是“单纯的”,即:不依赖上下文,譬如:

var sum = function(x, y){
    return x + y;
};

这个函数只要我输入的参数是2, 3,返回值永远都是5。可测试、可预料。简单直接(当然函数也可以完成先对复杂的工作,这个就看写作人对需求的认识、对代码的理解了)

而当面对“类”时,她是完全“不单纯”的,即:“类”就是创造了一个上下文,供各个实例对象使用;为什么要提供上下文,是因为“类”提供的是一系列相关行为,单一职责在这里显然力度更广,为什么是一系列行为,这其实就是人们常说的“高内聚”。打个比方,我现在写一个动物类:

class Animal {
    constructor(type){
        this.type = type;
    }
    
    movo(){
        console.log(`I am ${this.type}, i can run`);
    }
}

var cat = new Animal('cat');
var dog = new Animal('dog');

cat.move();//I am cat, i can run
dog.move();//I am dog, i can run

两个不同的类,catdog,都调用了move方法,参数都没有传,但显然输出内容不一样了,因为这里依赖了上下文this.type。但这样一个“动物”的使用场景,如果改用函数,怎么描述一个“猫”更合适?显然比较困难

再次补充:

最后再谈几句关于模块的事情,模块通常用来组织代码,和函数、类是不同纬度的工具,举个例子:

java 9中,模块类似命名空间,可以把若干有逻辑关联的类归在同一个模块下,方便他人使用(这里的方便他人使用,就是“组织”相关的工作)。

又或者,在javascript中,模块可以是一个函数(例如之前很火的left-pad),也可以是一个类(比如:bl)甚至可以是一大堆函数和类的集合(比如:express)。完全取决于你希望你的代码怎么样被组织、使用

构造函数加new传进参数,返回一个对象,而函数本身也是传进参数,返回一个对象,这点上来说两者的功能是一样的,然而实际上new操作符具有绑定this的作用。换句话说,你直接调用函数,你在函数里面的this指向你所在的对象,但是如果使用new来“构造调用”一个构造函数的话,构造函数的this指向返回的那个对象,也就是你需要创建的那个对象。(部分摘自Kyle Simpson的话)
然而这并没有带来什么好处,DC大神认为,new是JavaScript的糟粕之一,最好不要去使用。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题