示例:
function Person (name, age) {
this.name = name;
this.age = age;
}
var person1 = new Person('nick', 22);
var person2 = new Person('hellon', 20);
画出下图:
解析:Person是构造函数,具有name,age,prototype属性,每个构造函数都有一个原型对象(prototype),Person的prototype属性指向该构造函数的原型对象(prototype)。
构造函数:JS中的函数即可以是构造函数又可以当作普通函数来调用,当使用new来创建对象时,对应的函数就是构造函数,通过对象来调用时就是普通函数。
原型对象:
1.通过new构造函数可以得到实例,每个实例都有_proto_属性,实例的_proto_指向构造函数的原型对象;
2.所有对象都有_proto_;
3.对象的_proto_ === 构造函数的.prototype
4.访问一个对象的属性时,如果对象有这个属性,就获取到了;如果没有这个属性,则从protp中去找,如果没有找到,则去原型对象prototype里的proto中去寻找;再找不到就去Object对象里找,找不到就为null。例如:
function Person (nick,age) {
this.nick = nick;
this.age = age;
}
Person.prototype.sayName = function () {
console.log(this.nick);
}
var people = new Person();
//调用原型对象上面的方法
people.sayName();
原型对象、构造函数、实例之间的关系:
每个构造函数都有一个原型对象(prototype属性),原型对象上包含着一个指向构造函数的指针(constructor),而实例包含着一个指向原型对象的内部指针(实例._proto_ === 类.prototype)。通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数。
例子:
[]
function Person () {}
var child = new Person();
child.constructor;// ƒ Person(){} 实例的constructor === 构造函数
Person.prototype.constructor;// ƒ Person(){} 原型.constructor === 构造函数
child.__proto__.constructor;// ƒ Person(){}
child.__proto__;
// {constructor: ƒ}constructor: ƒ Person()__proto__: Object 实例._proto_ === 原型
Person.prototype;// {constructor: ƒ} 构造函数.prototype === 原型
child.__proto__ === Person.prototype;// true
上述代码关系图如下:
Object和Function的定义:
函数就是对象,代表函数的对象叫函数对象。
Function被称为构造器,其实也就是一个函数。js中所有的函数对象都是被Function这个函数对象构造出来的,所以Function是最顶层的构造函数,包括系统中所有对象、用户自定义对象、系统内置对象、以及Function自身。
Object是函数对象,所以对象都继承于Object,Object是顶层对象。
所有的函数对象都是被Function构造出来的,所以Object是被Function构造出来的。
Object和Function的创建过程:
第一步:js先创建的是Object.prototype这个原型对象;
第二步:在这个原型对象的基础上创建了Function.prototype这个原型对象;
第三步:通过这个原型对象创建出来了Function这个函数;
第四步:又通过Function这个函数创建出来Object这个对象。
创建过程:Object.prototype -> Function.prototype -> Function -> Object