javascript对象,函数谜题

阅读 3.6k
3 个回答

楼主可以引入以一个观念,就是JS是基于对象的脚本语言,就是说他的对象有着十分特别的实现。
首先JS函数的声明其实也是创建一个对象的实例,这个对象叫做Function

//你可以通过这样的方式创建函数
function f1();
var f2 = function();
//还可以通过这样的形式
var f3 = new Function();//通过Function构造函数来创建,这个构造函数称为“函数对象”,即是一种特殊的对象

这样就好理解了吧,其实JS中的函数本身也是一个对象的实例,这样的实例既有原型prototype,又有_proto_,可以将此比作“波粒二象性”;
我们把函数(有具体作用的代码段)比作波(包含一个起点到终点的过程,对于函数就是执行到返回);
把对象比作粒(具有实体的单元,对于对象来说就是实例);

那么JS里的函数对象就具有物理上所说的“波粒二象性”。

因此:

  • 在JS中,函数本身也是一个对象,因此“通过函数创建对象”的说法从实现上来说的确没有问题,但并不准确。

  • “函数对象”这个概念应当区分于普通对象—————创建了一个对象,它不一定是函数(构造函数),而一旦声明了一个函数,这个函数一定是一个对象。

  • Function的爹是Object(),所以说,JS是基于对象的脚本语言。

有什么不对么?人家说的非常对啊,看不懂建议多看几遍,写写例子

如果题主学过java,应该知道java的对象由定义在类里面的构造器生成。

看看

public Foo {
    private int value; 
    public Foo(int init_value){
        value = init_value; 
    }
    public void sayValue(){
        System.out.println("print: " + value);  
    }
    
    public static void main(String[] args){
        Foo bar = new Foo(233); // new一个Foo类实例,从Foo的构造器(里面的Foo方法)入手
        
        bar.sayValue();  // print: 233
    }
}

上面的例子可以看到java的对象生成是相对更复杂的的

  • 需要 Foo 构造器(没有就用默认)

  • 传递给构造器的参数可以不同,可以有多个构造器,有不同的构造策略

  • 需要 new 操作符

  • 保存对象的变量是有类型的 这里算是 Foo 类型 ( Foo bar = new Foo(233);


反观JavaScript

js是对象

这里我用 . 操作符来访问对象的属性,这样能通过调用某些方法看到 函数的名字函数源码之类,反应了js函数是对象的事实,另外,也可以用foo instanceof Object来看看 foo 是不是 对象
顺便一提Java的方法不是对象。

题主的疑惑

题主应该是初学JS的吧? 你应该改变你对函数的看法了, JS 里的函数跟 CJava 这类经典语言的函数(方法)有较大不同(最显而易见的是当参数传递这点)。

还有题主的问题问的比较模糊,希望能描述清楚一些。

个人也认为JS的对象都是由构造函数之类生成的,函数是对象毋庸置疑。

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