今天重新回顾了一下js的基础知识,感觉自己的基础还是不牢固,很多东西都忘记了.就此每天抽出时间来复习一下js的一些基础知识.
js原型链
js只有一种结构:对象.每个实例对象(object)都有一个私有属性( __ proto __),指向他的构造函数的原型对象( prototype ).该原型对象也有一个自己的原型对象( __ proto __),层层向上,直到一个对象的原型对象为null.根据定义,null没有原型,并且作为定义的最后一环.
我的理解里面就是:定义的一个函数(f()),在创建一个对象(o)
function f(){
this.a = 1;
this.b = 2;
}
let o = new f(); // a=1;b=2
再在f函数的原型上定义属性:
f.prototype.b = 3;
f.prototype.c = 4;
不要再原型链上直接定义 f.prototype = {b:3,c:4};这样会直接打破原型链.
最后其原型链应该为:
{a:1, b:2} —> {b:3, c:4} —> Object.prototype—> null
console.log(o.a); // 1
// a是o的自身属性吗?是的,该属性的值为 1
console.log(o.b); // 2
// b是o的自身属性吗?是的,该属性的值为 2
// 原型上也有一个'b'属性,但是它不会被访问到。
// 这种情况被称为"属性遮蔽 (property shadowing)"
console.log(o.c); // 4
// c是o的自身属性吗?不是,那看看它的原型上有没有
// c是o.[[Prototype]]的属性吗?是的,该属性的值为 4
console.log(o.d); // undefined
// d 是 o 的自身属性吗?不是,那看看它的原型上有没有
// d 是 o.[[Prototype]] 的属性吗?不是,那看看它的原型上有没有
// o.[[Prototype]].[[Prototype]] 为 null,停止搜索
// 找不到 d 属性,返回 undefined