首页 > javaScirpt中先有函数还是对象

javaScirpt中先有函数还是对象

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


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


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

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

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

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

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

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


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


函数本身就是对象


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中的爸爸,自己创造了自己,又给自己添加了一系列属性,让别人去继承。

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

【热门文章】
【热门文章】