本博客 hjy-xh,转载请申明出处
Constructor 构造函数
先写一个构造函数Person(构造函数一般为了区别普通函数,要求首字母大写):
1 2 3 4
| function Person(name, age){ this.name = name; this.age = age; }
|
prototype 原型
原型是一个对象,实例”继承”对象的属性.
也就是说在原型上定义的属性,通过”继承”这个行为,实例也拥有这个属性.该行为是在new关键字内部实现的.
我们把构造函数打印出来看看,发现其内部有一个名为prototype属性,通过它就能访问到原型:

Person 就是构造函数,Person.prototype 就是原型

instance 实例
现在有构造函数了,我们可以在原型上创建可以被”继承”的属性,并通过new关键词创建实例

可以使用 instanceof 就是判断一个实例是否属于某种类型,现在创建一个实例:
1 2
| let person = new Person("小黄",22); console.log(person instanceof Person);
|
如果我们在原型上定义一个属性后再实例化对象:
1 2 3 4 5 6 7 8
| function Person(name, age){ this.name = name; this.age = age; } Person.prototype.eyeColor = "black"
let person = new Person("小黄",22); console.log(person.eyeColor);
|
proto 隐式原型
实例通过 proto 访问到原型:

所以以下二者等价
1 2 3 4 5 6 7 8
| function Person(name, age){ this.name = name; this.age = age; } Person.prototype.eyeColor = "black"
let person = new Person("小黄",22); console.log(person.__proto__ === Person.prototype);
|
constructor 构造函数(属性)
原型可以通过constructor访问到构造函数:
1 2 3 4 5 6
| function Person(name, age){ this.name = name; this.age = age; }
console.log(Person.prototype.constructor === Person);
|
继续完善关系图:

注意这里的 constructor 是原型的一个属性,Constructor 指的才是真正的构造函数。两者名字不要弄混了
原型链
原型同样也可以通过 proto 访问到原型的原型,直到搜索到null:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function Person(name, age){ this.name = name; this.age = age; } Person.prototype.eyeColor = "black";
function People(){} People.prototype = new Person();
let people = new People() console.log(people instanceof Object) console.log(people instanceof People) console.log(people instanceof Person) console.log(people.eyeColor) console.log(people.__proto__) console.log(people.__proto__.__proto__) console.log(people.__proto__.__proto__.__proto__) console.log(people.__proto__.__proto__.__proto__.__proto__)
|
由此可以得出原型、原型链、构造函数、实例、null之间的关系:
