js原型对象和原型链

7236116-2ded02cfd1400117.jpg
图片发自简书App


有两个重要知识是:

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操作符时候,代码块可以执行并返回对象的函数

函数是一种有(可执行的代码块)的对象,就是说,函数拥有(可执行的代码块)外,还有属性。

猜你喜欢

转载自blog.csdn.net/weixin_34403693/article/details/87474499