有两个重要知识是:
1.js的每一个函数都自带有一个属性prototype,指向一个对象,这个对象就是当函数作为构造函数时的原型对象。
(如图Person是一个函数,Person就自带有一个属性prototype,指向的对象,就是Person.prototype)
2.js的每一个对象都自带有一个属性__proto__,指向本对象对应的构造函数的原型对象。
(如图person1是一个Person构造函数实例出来的对象,那么Person1.__proto__就是指向其构造函数Person的原型对象Person.prototype)
--------
记住,没有构造函数这个东西,只有函数(是有可执行代码块的对象)和对象,所谓构造函数只是当用new时,才作为构造函数。
函数才有原型属性! 对象能使用其构造函数的原型对象里的属性。
js中你要这样正确理解的点:
1.js中的对象是以函数为抽象模板创造的,如你平时使用的var o = {},就是以函数Object为抽象模板去实例化出来一个对象。
2.js中,Object是一个函数。不是对象。这是js内置写好的函数。
它是函数,js用它来为你实例出对象,一般你写的对象都是以Object函数为抽象模板,去实例出来一个对象。
3.Function也是一个函数,不是对象。一般你写的函数都是以它为抽象模板,去实例出来一个函数对象。
-------------------------
函数是谁的实例?
函数都是函数Function的实例。
对象是谁的实例?
对象是函数Object的实例,或者是其构造函数的实例。
--------------------------
所以当我们创建一个函数Person时,这个函数也是对象,它是函数Function的实例。所以它的原型对象就是它的构造函数的原型对象是Function.prototype。
当我们创建了一个函数Person时,浏览器就为此函数Person添加了一个prototype属性,就会自带有一个原型属性,这个属性是一个对象:Person.prototype。
而这个Person.prototype对象是怎么从哪里实例出来的,对象当然是从Object函数实例而来。
Person是一个函数对象,是函数,函数都是从Function那里被实例出来的。
所以Person.__proto__.constructor === Function 。
Person.__proto__ === Function.prototype 。
而Person.prototype是内存中的一个对象,是对象,那么这个对象是哪个函数构造出来的?是Object函数构造出来的。
总结就是:
我们写的每个函数函数都是以函数Function为模板实例而来的函数对象,我们写的一般对象比如字面量对象是以Object函数为模板实例而来的,我们new一个函数,则会以这个函数为模板去实例出来对象。
所以:Person此函数对象是以Function函数为抽象模板实例出来的,Person.prototype此对象是以Object为抽象模板实例出来的。person1此对象是以person函数为抽象模板实例出来的。
----------
1.内存中有变量,
2.对象是无序的变量集聚。
3.函数是比普通对象多了一块(可执行的代码块)的对象。
4.构造函数是在new操作符时候,代码块可以执行并返回对象的函数
函数是一种有(可执行的代码块)的对象,就是说,函数拥有(可执行的代码块)外,还有属性。