84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
函数
ringa_lee
谁说对象都是函数构造出来的?
所有对象都不是函数构造出来的!
对象是由JavaScript运行时环境以原型对象为模板,直接产生出来的。构造函数只是以新生的对象为this,做一些初始化操作。
所以,不要以为var p = new Person()说明了p是由Person产生的,其实是由Person.prototype产生的。
var p = new Person()
至于先有函数还是先有对象,这不是个问题。因为那些最基本的内置对象,肯定是由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中的爸爸,自己创造了自己,又给自己添加了一系列属性,让别人去继承。
上帝创造了亚当,然后用他的肋骨创造了夏娃,然后生了儿子。儿子是从哪来的?
谁说对象都是函数构造出来的?
所有对象都不是函数构造出来的!
对象是由JavaScript运行时环境以原型对象为模板,直接产生出来的。构造函数只是以新生的对象为this,做一些初始化操作。
所以,不要以为
var p = new Person()
说明了p是由Person产生的,其实是由Person.prototype产生的。至于先有函数还是先有对象,这不是个问题。因为那些最基本的内置对象,肯定是由JavaScript运行时环境直接生成的,不适用通常的对象产生规则。比如Object.prototype、Object、Function.prototype等,它们的产生没有先后顺序。有了这些基本对象后,就可以按照JS的规则产生其他对象了。
个人观点,仅供参考。要想知道真实情况,还是去读一下V8源码吧。
从设计理念来说, 一切皆是对象。 所以先有对象。。。。
函数本身就是对象
Java中对象是由类构造方法构造出来的,同时类也是对象。那么问题来了,Java中是先有对象还是先有类?
js中的一切都是由函数创建的
先看个例子
证明对象可以由函数创建,但是也仅仅只证明了可以由函数创建。还可能通过下面的方式创建
但是不好意思,这仅仅是一种语法糖而已,实质上他们等价于
然而Array和Object都是函数
所以,得出对象是由函数创建的。
但是有人会说了,Object是函数,所以他也有原型,原型不是对象吗?
对的Object的原型是{},是一个对象,既然是对象,那么肯定有隐式原型也就是__proto__。
因为正常情况下对象的__proto__是指向创建该对象的函数的prototype。但是Object是唯一的特例:Object.prototype.__proto__是指向null的。
但是上面有人说了函数也是对象,是的,函数也是对象,既然是对象,那么必然有隐式原型__proto__。正常情况下对象的__proto__是指向创建它的函数的prototype的,那么Function既然是一个对象,他的__proto__指向谁呢?
没错,Function的__proto__是指向自己的原型,这就形成了一个闭路,这就是原型链,对象顺着原型一路查找到Function,然后顺着Function的原型又向下查找。
所以得出结论,Function才是js中的爸爸,自己创造了自己,又给自己添加了一系列属性,让别人去继承。
上帝创造了亚当,然后用他的肋骨创造了夏娃,然后生了儿子。儿子是从哪来的?