基础:
只有构造函数有原型属性 - prototype,它是一个对象
原型对象中有个constructor属性,constructor指向构造函数本身,也只有原型对象具有constructor属性
所有的对象都有 __protp__属性,它也是个对象
1.构造函数
// 构造函数
function Student(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
// 多个对象,会存储多个sayHi方法
this.sayHi = function () {
console.log('大家好,我是' + this.name);
}
}
var s1 = new Student('lilei', 18, '男');
var s2 = new Student('hmm', 18, '女');
s1.sayHi();
s2.sayHi();
console.log(s1.sayHi === s2.sayHi); // false 两个独立的sayHi方法
我们可以通过构造函数批量创建具有相同属性的对象,但当构造函数内有静态方法的时候,每创建一个实例都会为静态方法在内存中开辟一块空间,而这些方法都是一样的,浪费内存。
解决方案是将静态方法放在构造函数的原型prototype上,构造函数的原型不会被实例拷贝,所有的实例对象都可以访问构造函数的原型,这样节省了内存空间。
function Student(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
Student.prototype.sayHi = function () {
console.log('大家好,我是' + this.name);
}
// 通过Student构造函数,创建的对象,可以访问Student.prototype中的成员
var s1 = new Student('lilei', 18, '男');
var s2 = new Student('hmm', 18, '女');
s1.sayHi();
s2.sayHi();
console.log(s1.sayHi === s2.sayHi);// true
2.原型链
把构造函数、构造函数的原型、构造函数的实例之前的关系成为原型链
3.查找规则
实例对象访问一个方法或者属性的步骤
1.在本身对象内查找
2.通过__proto__
访问构造函数的原型prototype内查找
3.通过构造函数的原型prototype内的__proto__
访问Object构造函数的原型prototype查找,结果是 null