1. 原型链的内存结构图
-
每个 对象 都有一个
__proto__
属性,代表其原型对象(IE不支持) -
每个 函数对象 都有一个
prototype
属性,代表其创建对象的原型 -
每个 原型对象 都有一个
constructor
属性,代表其创建函数 -
每个对象都有一个原型,同时每个对象又可以是其他对象的原型;
-
每个对象都有一个构造函数,每个对象都是由构造函数创建的。
-
注:
-
Object()
函数的原型属性是顶级原型,顶级原型的原型对象是null
; -
所有的函数原型对象都是以顶级原型为原型对象的;
-
所有函数对象都是由
Function()
函数创建的,因此,函数对象的原型对象是Function 原型
。
-
2. 修改原型属性
<script>
function Pet(name, love, health){
this.name = name || '无名';
this.love = love || 60;
this.health = health || 60;
this.showBaseInfo = function(){
console.log('姓名:' + this.name);
console.log('亲密度:' + this.love);
console.log('健康值:' + this.health);
};
}
function Dog(){ }
// 修改 Dog 的原型属性
Dog.prototype = new Pet();
// 同时,必须修改原型对象的 constructor 属性
Dog.prototype.constructor = Dog;
// 创建 Dog 对象
var dog = new Dog();
dog.name = '小黄';
dog.health = 100;
dog.showBaseInfo();
</script>
注: 修改函数原型属性的同时一定要修改原型属性的 constructor
属性,让它指向函数本身,JS 不会自动修改。 如下图所示: