又重新了下js教程https://wangdoc.com/javascript/oop/new.html
记录以下问题
(ps:每一次看的时候都有新的感悟,但是都没记录下来)
1. 对象是什么?第一反应是,,封装,继承,多态。。
简单来说就是 属性和方法的集合(c++,oc上的对象是结构体,js一度认为js上的对象不就是字典嘛不就是map嘛)
Map对象是一种有对应 键/值 对的对象, JS的Object也是 键/值 对的对象 ;
ES6中Map相对于Object对象有几个区别:
- Object对象有原型, 也就是说他有默认的key值在对象上面, 除非我们使用Object.create(null)创建一个没有原型的对象;
- 在Object对象中, 只能把String和Symbol作为key值, 但是在Map中,key值可以是任何基本类型(String, Number, Boolean, undefined, NaN….),或者对象(Map, Set, Object, Function , Symbol , null….);
- 通过Map中的size属性, 可以很方便地获取到Map长度, 要获取Object的长度, 你只能用别的方法了;
总结一句话:Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。
2. 构造函数
构造函数的特点有两个。
- 函数体内部使用了this关键字,代表了所要生成的对象实例。
- 生成对象的时候,必须使用new命令。
3. new命令的原理
- 创建一个空对象,作为将要返回的对象实例。
- 将这个空对象的原型,指向构造函数的prototype属性。
- 将这个空对象赋值给函数内部的this关键字。
- 开始执行构造函数内部的代码。
判断是不是用new来调用 this instanceof Class 和 new.target
4. this关键字
直接上代码
var obj ={
foo: function () {
console.log(this);
}
};
obj.foo() // obj
// 情况一
(obj.foo = obj.foo)() // window
// 情况二
(false || obj.foo)() // window
// 情况三
(1, obj.foo)() // window
最后还想说一下要注意闭包是不能捕获this的,解决办法 1. that(局部变量) 2. bind 3.箭头函数
下一次记录后三节