一、什么是原型和原型链
1)每一个对象上,都有一个属性,叫__proto__,它指向了一个对象,这个对象我们叫原型对象。
2)每一个构造器(类,函数),也是对象,这个对象上,有一个属性,叫prototype,它也指向一个对象,
和__proto__指向同一个对象,也是原型对象
3)每一个原型对象上,都是有一个属性,叫constructor,它指向此原型对象所对应的构造器
4)原型链:原型链指查找对象上某个属性的查找机制,查找一个对象上的私有属性,先在自己的私有属性中
找,找不到,就沿着__proto__去原型对象上找…
5)作用域链:在EC中,查找数据的一个机制
示例图解如下图所示:

toString():
1)在Object的原型对象上,有一个toString方法。
2)如果对象上,自己有toString方法,调用toString方法时,肯定是调用自己的toString方法。
==:
等于符号,判断左右两侧的操作数是否相等。 当判断,如果一侧是引用数据类型,它默认就会调用
toString。
如果自己有toStirng,那么调用自己的toString,如果没有,调用Object原型对象上的toString。
二、 原型和原型链练习题
练习一

练习二

练习三

练习四

三、a在什么情况下可以等于1等于2等于3
方法一
<script>
// 一个对象和一个number进行比较,数据类型不一致
// 此时,a会自动调用一个toString方法
let a = {
n:0,
toString:function(){
return ++this.n
}
};
// a虽然没有明面上调用toString,实际内部会调用toString
// === 不行 因为上来先判断类型
console.log(a == 1); // true
console.log(a == 2); // true
console.log(a == 3); // true
// 每比较一次都会toString()
if(a == 4 && a == 5 && a == 6){
console.log("ok");
}
</script>

方法二
<script>
// toString
let a = [1,2,3]
console.dir(a)
// push a.push(4)
// pop a.pop() 删除最后一个元素
// shift a.shift() 删除第一个 返回删除的元素
// unshift a.unshift(x) 在最前面添加一个元素
// 给a添加一个私有属性,叫toString 功能和shift是一样的
a.toString = a.shift;
if(a == 1 && a == 2 && a == 3){
console.log("ok");
}
</script>

146

被折叠的 条评论
为什么被折叠?



