1.函数与对象的关系
- 函数是对象,对象都是通过函数创建的
- 函数与对象并不是简单的包含与被包含的关系
2.原型的类别
- 显示原型:prototype,是每个函数function独有的属性
- 隐式原型:_proto_,是每个对象都具有的属性
3.原型和原型链
原型:一个函数可以看成一个类,原型是所有类都有的一个属性,原型的作用就是给这个类的一个对象都添加一个统一的方法
原型链:每个对象都有一个_proto_,它指向它的prototype原型对象,它的prototype原型对象又有一个_proto_,指向它的prototype原型对象,就这样层层向上直到最终找到顶级对象Object的prototype,这个查询路经就是原型链
4.js里面最顶层的两个概念
(1)Function是最顶层的构造器
Function是js里面最顶层的构造器,它构造了系统中的所有对象,包括用户自定义对象,系统内置对象,甚至包括它自己
(2)Object是最顶层的对象
所有对象都继承Object的原型
Object也是被Function构造出来的
5.函数.prototype
(1)每个函数都自带一个属性叫做prototype
每个函数其实有个prototype属性,prototype的属性值是一个对象,这个对象默认的只有一个叫做constructor的属性,指向这个函数本身
(2)在js中,每一个函数都有一个prototype属性,这个属性指向函数的原型对象。需要注意的是它的prototype属性也是一个对象!每个对象都有一个__proto__属性。每个js对象的__proto__属性都会指向该对象的原型对象,并从原型对象上继承属性和方法。
per是实例对象,它的构造函数是Person,它的原型对象是Person.prototype 所以实例对象的__proto__属性(per.__proto__)会指向它的原型对象(Person.prototype)
//构造函数
function Person(){
}
//实例对象
var per=new Person();
//实例对象的__proto__属性指向其原型对象
console.log(per.__proto__===Person.prototype); //true
6.总结
实例.__proto__ === 原型
原型.constructor === 构造函数
构造函数.prototype === 原型