suchen

Heim  >  Fragen und Antworten  >  Hauptteil

javascript - javaScirpt中先有函数还是对象

js中函数也是对象,但是对象也是函数构造出来的?那么问题来了,js中先有对象还是函数呢?

ringa_leeringa_lee2889 Tage vor380

Antworte allen(5)Ich werde antworten

  • 高洛峰

    高洛峰2017-04-11 12:07:09

    谁说对象都是函数构造出来的?

    所有对象都不是函数构造出来的!

    对象是由JavaScript运行时环境以原型对象为模板,直接产生出来的。构造函数只是以新生的对象为this,做一些初始化操作。

    所以,不要以为var p = new Person()说明了p是由Person产生的,其实是由Person.prototype产生的。

    至于先有函数还是先有对象,这不是个问题。因为那些最基本的内置对象,肯定是由JavaScript运行时环境直接生成的,不适用通常的对象产生规则。比如Object.prototype、Object、Function.prototype等,它们的产生没有先后顺序。有了这些基本对象后,就可以按照JS的规则产生其他对象了。

    个人观点,仅供参考。要想知道真实情况,还是去读一下V8源码吧。

    Antwort
    0
  • 迷茫

    迷茫2017-04-11 12:07:09

    从设计理念来说, 一切皆是对象。 所以先有对象。。。。

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-11 12:07:09

    函数本身就是对象

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-11 12:07:09

    Java中对象是由类构造方法构造出来的,同时类也是对象。那么问题来了,Java中是先有对象还是先有类?

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-11 12:07:09

    js中的一切都是由函数创建的

    先看个例子

            function Fn() {
                this.name = 'hersface';
            }
            var fn1 = new Fn();

    证明对象可以由函数创建,但是也仅仅只证明了可以由函数创建。还可能通过下面的方式创建

    var obj = { a: 10, b: 20 };
    var arr = [5, 'x', true];

    但是不好意思,这仅仅是一种语法糖而已,实质上他们等价于

            //var obj = { a: 10, b: 20 };
            //var arr = [5, 'x', true];
    
            var obj = new Object();
            obj.a = 10;
            obj.b = 20;
    
            var arr = new Array();
            arr[0] = 5;
            arr[1] = 'x';
            arr[2] = true;

    然而Array和Object都是函数

    console.log(typeof (Object));  // function
    console.log(typeof (Array));  // function

    所以,得出对象是由函数创建的。

    但是有人会说了,Object是函数,所以他也有原型,原型不是对象吗?
    对的Object的原型是{},是一个对象,既然是对象,那么肯定有隐式原型也就是__proto__。
    因为正常情况下对象的__proto__是指向创建该对象的函数的prototype。但是Object是唯一的特例:Object.prototype.__proto__是指向null的。

    console.log(Object.prototype.__proto__===null)//true

    但是上面有人说了函数也是对象,是的,函数也是对象,既然是对象,那么必然有隐式原型__proto__。正常情况下对象的__proto__是指向创建它的函数的prototype的,那么Function既然是一个对象,他的__proto__指向谁呢?

    console.log(Function.prototype===Function.__proto__)//true

    没错,Function的__proto__是指向自己的原型,这就形成了一个闭路,这就是原型链,对象顺着原型一路查找到Function,然后顺着Function的原型又向下查找。

    所以得出结论,Function才是js中的爸爸,自己创造了自己,又给自己添加了一系列属性,让别人去继承。

    上帝创造了亚当,然后用他的肋骨创造了夏娃,然后生了儿子。儿子是从哪来的?

    Antwort
    0
  • StornierenAntwort