一切皆对象
每个函数都有一个属性叫做prototype。
这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor(构造函数)的属性,指向这个函数本身。
Object的原型:
通过如下方法可以添加Prototype的属性
function Fn() { } Fn.prototype.name = '白十三'; Fn.prototype.getYear = function () { return 1997; };
function Fn() { } Fn.prototype.name = '白十三'; Fn.prototype.getYear = function () { return 1997; }; var fn = new Fn(); console.log(fn.name); console.log(fn.getYear());
Fn是一个函数,fn对象是从Fn函数new出来的,这样fn对象就可以调用Fn.prototype中的属性。
因为每个对象都有一个隐藏的属性——“__proto__”,这个属性引用了创建这个对象的函数的prototype。即:fn.__proto__ === Fn.prototype
每个对象都有一个__proto__,可成为隐式原型。
每个对象都有一个__proto__属性,指向创建该对象的函数的prototype。
是Object.prototype确实一个特例——它的__proto__指向的是null,切记切记!
一个对象要么是类似于 new Fn()出来的要么是new Object()创建出来的,所以对象的_proto_都会指向 Fn.prototype或者Object.prototype。
自定义函数的prototype本质上也是对象,就是和 var obj = {} 是一样的,都是被Object创建,所以它的__proto__指向的就是Object.prototype。
函数也是一种对象,函数当然也有__proto__
函数也不是从石头缝里蹦出来的,函数也是被创建出来的。谁创建了函数呢?——Function——注意这个大写的“F”。
以上代码中,第一种方式是比较传统的函数创建方式,第二种是用new Functoin创建。
首先根本不推荐用第二种方式。
这里只是向大家演示,函数是被Function创建的
Function也是一个函数,函数是一种对象,也有__proto__属性。既然是函数,那么它一定是被Function创建。所以——Function是被自身创建的。所以它的__proto__指向了自身的Prototype。
总结:
每个函数都有一个属性叫做prototype。
对象是被函数创建的,对象都有__proto__属性,指向创建了该对象的函数的prototype。
函数一定是被Function创建的,函数也是对象,对象都有__proto__属性,函数的__proto__属性,指向Function的prototype。
prototype也是对象,都是被Object创建,所以它的__proto__指向的就是Object.prototype。
Object.prototype的_proto_指向null
Function是被自身创建的,所以它的__proto__指向了自身的Prototype。