java是先有类还是先有对象_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中的爸爸,自己创造了自己,又给自己添加了一系列属性,让别人去继承。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值