1、原型链
原型链:一个实例化对象在寻找一个属性的时候,会先从自身属性寻找,其次到上级原型链,直到Object,如果还找不到就分会undefined,这就称之为原型链。
下面绿色框框的是原型链
function CreatP(n){
this.name = n;
}
CreatP.prototype.sayHeelo = function(){
consloe.log('Heelo!');
};
CreatP.prototype.eat = function(){
consloe.log(this.name);
}
var a = new CreatP('小阳','18');
console.log(a);
/*
1、这个时候再实例化的对象里有a.__proto__属性,
这个属性指向了CreatP.prototype原型,也就是内存地址相同
*/
console.log(a.__proto__ == CreatP.prototype);//true
/*
2、 这个时候,CreatP.prototype也是对象,
所以下面也有CreatP.prototype.__proto__,而这个属性的值为Object.prototype
*/
console.log(CreatP.prototype.__proto__ === Object.prototype);//true
/*
3、直到Object.prototype就没有__proto__的值(null)
也就是Object是所有原型的顶端,而下面的__proto__和
prototype链接起来的就是原型链
*/
console.log(Object.prototype.__proto__ === null);//true
2、原型链小例子
/* 构造函数没有的话,就向原型链寻找 */
function Creat(n){
}
CreatP.prototype.name = '楠楠';
var a = new CreatP();
console.log(a.name);//楠楠
/* 例2 向Object寻值*/
function Creat(n){
}
Object.prototype.name = '楠楠';//Object原型链
var a = new CreatP();
console.log(a.name);//楠楠
总结:永远不要向Object.prototype添加属性,因为给Object原型添加了属性,就相当于给所有的对象都添加了这个属性,污染了全局。
-
用到的关键字:prototype(原型)、new、this
函数本身就有prototype属性,
被new后就会拥有__proto__属性