Table of Contents
# Javascript 遗忘点
* 属性描述符
* 原理
* 可以使用Objecct.getOwnPropertyDescriptor进行访问
* 可以使用Object.defineProperty配置
* 严格模式下会生效
* 值 value
* 属性的值
* 可写 writable
* 可以修改属性的值
* 可配置 configurable
* 可以使用defineProperty 修改属性描述符
* 可枚举 Enumerable
* for ... in... 可以访问
* <span color:"red">原型、原型链、构造函数、实例</span>
* 原型(对象):
* 构造函数的prototype
* 在自身找不到的对象,会在原型对象中查找
* 默认会生成constructor对象,指向构造函数
* 原型链:
* 每个对象都有\_\_proto\_\_
* 每个原型链都是对象,所以\_\_proto_\_连起来,就是原型链
* 构造函数:
* 在JavaScript中就是一个普通函数
* constructor中指向构造该对象的函数
* \_\_proto\_\_
* 对象中存在
* 指向构造函数的原型
* constructor
* 是原型对象中默认带有的属性,指向构造函数
* 可以方便后续处理,比如判断是不是数组
## this 指针
* 为什么要用this
* 写代码可以变得简洁,优雅
* this 绑定规则
* 默认绑定
* 严格模式
* 绑定的是unidefined
* 非严格模式
* 绑定的是全局空间
* nodejs和dom不同
* 隐式绑定
* 考虑上下文对象的调用
* console.log() // 如果默认输出,会在console里面找变量
* 隐式丢失
* 对象引用值地址执行==>会丢失
* 传递引用值为参数==>会丢失
``` Javascript
function a(){
console.log(a)
};
var a = 100;
b ={
a:10,
bb:a,
}
//////////////////////////////
var c = b.bb;
c(); // 这里相当于还是默认绑定
//////////////////////////////
callable(b.bb) //也是相当于默认绑定
```
* 显式绑定
* 使用call和apply
* 无法解决丢失绑定的问题
* 硬绑定
* 可以解决显示绑定丢失的问题
``` Javascript
function foo(something) {
console.log(this.a, something);
return this.a + something;
}
// 简单的辅助绑定函数
function bind(fn, obj) {
return function() {
return fn.apply(obj, arguments);
};
}
var obj = {
a:2
};
```
* new绑定
``` Javascript
var bar = new foo(2);
// new 绑定就是把新建的对象绑定到this
```
## JavaScript对象
* 对象的访问方式
* 键访问
* 对象[属性名] ==> 访问
* 键访问支持动态变量名定义
* 对象[getName()] = name
* 属性访问
* 对象.属性 ==> 访问
* 对象特性
* 对象的原型
* 指向另一个对象,该对象的属性继承自原型链指向的对象
* 对象的类
* 表示对象类型的字符串
* 对象的扩招标记
* 是否可以向对象添加新的属性
* 对象的分类
* 内置对象
* ECMAscript规范对弈的对象或者类(数组,函数,日期)
* 宿主对象
* JavaScript嵌入web浏览器,web浏览器就是宿主
* 自定义对象
* 运行中的JavaScript创建的对象
* 自有属性
* 直接在对象中定义的属性
* 继承属性
* 从原型对象中继承过来的属性
* 创建对象的方式
* 概述
* new 可以创建
* Object.create() 函数可以创建对象
* 对象直接量 {}
* 就是用Python中定义字典的方式在JavaScript中创建对象
* new 来创建对象
* new 后面跟一个函数调用
* 函数调用实际上就是一个构造函数 constructor
* 构造函数用来初始化一个新创建的对象
* 原型
* 概述
* 除了null,每一个对象斗与JavaScript相关联
* 对象继承原理
* 直接量创建的对象都继承自Object.prototype
* new关键字创建的,都继承new对象的prototype(new Date //Date.prototype)
* Object.create()
* [立即执行函数](https://www.jb51.net/article/50967.htm)
* 作用
* 避免全局被污染
* 函数声明
* 函数声明会被提升
* 函数声明外层加括号,是将函数声明转换成了函数表达式
``` Javascript
function test(){}
```
* 函数表达式
* 函数表达式执行到语句才会进行处理函数
* 函数表达式后面可以直接加括号进行执行
``` Javascript
var test = function (){}
var test = function (){}();//可以进行执行
```
* 匿名函数
* 匿名函数不能直接定义加括号执行
``` Javascript
function (){}
```
* 函数定义
``` javascript
/**
* 类型判断
* 1、文件传参_=[] 这是想当于在全局定义了一个_ ,然后传递给函数
* 2、传递的是一个{},这是一个引用类型,可以往里面添加数据
*/
(function (_) {
// 列举出可能存在的数据类型
var types =
"Array Object String Date RegExp Function Boolean Number Null Undefined".split(
" "
);
console.log("this test");
function type() {
// 通过调用toString()函数,从索引为8时截取字符串,得到数据类型的值
console.log("type" + this);
return Object.prototype.toString.call(this).slice(8, -1);
}
for (var i = types.length; i--; ) {
_["is" + types[i]] = (function (self) {
return function (elem) {
return type.call(elem) === self;
};
})(types[i]);
}
// return _;
})((_ = {}));
_.isArray([1, 2]);
```
## 混合对象类
## 原型链