原型复习笔记
1.实例对象的原型 __proto__ 和构造函数的原型prototype指向是相同的
2.实例对象中的__proto__ 原型指向的是构造函数中的原型prototype
原型对象中的constructor指向构造函数 (Person(){})
3.实例对象可访问原型对象中的属性和方法
实例中的__proto__ 是原型,浏览器使用的
构造函数中的prototype是原型,是程序员使用的
prototype的__proto__指向的是Object的prototype
Object.prototype的__proto__指向的是null
4.原型指向可以改变
实例对象的原型__proto__ 指向的是该对象所在的构造函数的原型对象
构造函数的原型对象(prototype)指向如果改变了,实例对象的原型(__proto__)指向也会发生改变
实例对象和原型对象之间的关系是通过__proto__原型来联系起来的,这个关系就是原型链
function Person(name) {
this.name = name;
}
Person.prototype.sayHi = function () {
console.log('hello');
}
var xiaomin = new Person('小明');
console.log(xiaomin.name)
xiaomin.sayHi();
console.dir(Person);
console.dir(xiaomin)
console.dir(xiaomin.__proto__ == Person.prototype)
组合继承
组合继承,有时候也叫伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承,这样既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有他自己的属性
function SuperType(name) {
this.name=name;
this.colors=['red','blue','green'];
}
SuperType.prototype.sayName=function () {
console.log(this.name)
}
function SubType(name,age) {
//继承属性
SuperType.call(this,name);
this.age=age;
}
//继承方法
SubType.prototype=new SuperType();
SubType.prototype.constructor=SubType;
SubType.prototype.sayAge=function () {
console.log(this.age)
};
var instance1=new SubType('小明',29);
instance1.colors.push('black');
console.log(instance1.colors);
instance1.sayName();
instance1.sayAge();
var instance2=new SubType('小红',39);
console.log(instance2.colors);
instance2.sayName();
instance2.sayAge();