学习前端在b站有许许多多的视频,但绝大部分都是如同手册和文档一样是基于使用的,通过反复练习去记忆,这样效率不高也容易忘记。之前发现一个好看不火的宝藏up,对于知识原理方面讲的很通俗透彻,个人感觉很好。这些是我学习过程中的个人简易总结,推荐学习原版,感兴趣私聊我吧,有些事情讲究缘分。
实例化原理
言归正传,我们知道一般把new出来的构造函数的过程叫做实例化。我们都会通过new来使用,但清楚实例化的原理吗?
<script>
function Car (color,brand){
this.color = color;
this.brand = brand;
}
var car = new Car('red','Benz');
console.log(car);
</script>
这就是实例化过程,里面的this是什么呢?从预编译的角度来分析一下,GO里面存着Car function(){} 和car变量,在没执行时不关注Car函数体里面的是什么,也没有意义。当new Car()时就执行Car函数了。
<script>
function Car(color, brand) {
// this = {}
this.color = color;
this.brand = brand;
//上面相当于
// this {
// color : color,
// brand : brand,
// }
// return this; 隐式存在
}
var car = new Car('red', 'Benz');
console.log(car);
</script>
比较一下这个和上面的,其实实例化的过程中隐式存在了先将this定义成一个空对象,然后把属性写进来,最后返回出去,这个对象从AO到了全局GO上。this的指向也从Windows变成指向实例化对象car。
function Car(color, brand) {
me = {};
me.color = color;
me.brand = brand;
return me; // 隐式存在
}
var car = Car('red', 'Benz');
console.log(car);
我们把它改成这样同样可以,用普通函数的形式来写。这就是实例化的原理,核心是return出去,使用我们可以增删改查car,只不过new的是内置好了而且是隐式的。注意,return 出去的要是引用对象才行,基本类型无效。而且null和undefined不能添加属性和方法。
包装类
什么是包装类呢,应该是new String() , new Number(), new Boolean()。
var a = 100;
a.length = 2;
var b = '100';
b.length = 2
console.log(a.length);
console.log(b.length);
猜猜结果是什么? 结果是undefined 3 。为什么数字类型没有length属性,而字符串就有呢。
其实不是字符串有length属性,而是new String() 有length属性,new Number()没有,系统其实进行内部转换。
// 包装类
var a = 100;
a.length = 2;//相当于new Number(a).length = 2
console.log(new Number());//里面没length属性
console.log(new String());//里面有length属性
var b = '100';
b.length = 2//相当于new String(b).length = 2 但没有地方存储length,b是string,不能存
//故程序又会删除这个代码,delete
console.log(a.length);
console.log(b.length);//所以打印的是3,b.length = 2执行又删除,没有存储下来
//那怎么办存下来能?只要进行包装类就能存储到原来的变量身上
var c = new Number(100);
c.length = 2;//相当于new Number(c).length = 2 存储length,c是包装类,可以存
console.log(c);
console.log( c.length);
就跟里面分析的一样,但如果修改string里面的length,好像无效,因为他已经有了length属性.
另外length用在数组里可以当做截断。