this指向
1.默认绑定规则 指向window或global
2.隐式绑定规则,谁调用 this指谁 (fn()相当于window调用;xx.fn()相当于xx调用,this指向xx)
3.显示绑定规则,call/apply |bind
显示指定了this
call(obj,a,b) apply(obj,[a,b]) bind(this,a,b)
4.new, this指向了new出来的实例 new最大 优先级最高
优先级: new>显示绑定>隐式绑定>默认绑定
this是无法==直接赋值==的
1 | class Modal{ |
bind的作用是修改&绑定this指向(bind是作用于函数上的方法)。上述代码,this原本指向button,但是bind(this)中的this指的是当前上下文的this(即Modal创建的对象实例),所以this.close.bind(this)中两个this都被指向了Modal创建的对象实例。
基本功
某种类型的 字面量形式创建和new+构造函数创建的区别
1.字面量形式创建,出来就是那种类型;new 构造函数创建,出来时为object对象类型!
2.new方式会划出新的一片内存空间,而且因为是对象,存在堆内存中;
字面量方式是看以前有没同样的值,有就直接引用,没有才创建(设计模式Flyweight)
但是:例如st=new String(“st”)创建出来的内容类型为object,
结果st.__proto__ === String.prototype | st.__proto__!\=\=Object.prototype
资料:参考学习
https://blog.csdn.net/duansale/article/details/74951091?utm_source=blogxgwz8
构造函数与字面量形式创建区别
https://www.jb51.net/article/133346.htm 函数带new不带new
function Person(x,y){this.x = x;this.y=y;}
var personA = Person(1,2); 这个personA相当于执行Person(x,y)后的返回值
var personB = new Person(1,2); 相当于用Person构造函数构造了一个Person类型(实际上没Person类型,而是万能的Object类型)
personB为 => Person {x: 1, y: 2}
面向过程与面向对象
面向过程-考虑点:这个事情怎么?步骤如何?过程是怎么样的?
面向对象-考虑面:这个事情有什么特点?涉及哪些方面?该如何划分?
面向对象特征
- 抽象-抽取事物的共性部分,是面向对象设计的一个重要步骤
- 封装-通过类的形式对抽象内容进行实现的过程
- 继承-子类可以直接使用父类的部分数据和方法,同时可以有选择地扩展
- 多态-同一类对象调用相同方法可表现出不同行为或不同形态
抽象
==共性==
- 外观-属性(名词或形容词)
- 功能-方法(动词)
封装
通过类型构造出来的一个具体实例
类相当于图纸,对象是图纸做出来的一个实际物件
继承(一般子类不允许修改父类,) 先抽象成对象A和对象B,对比对象A和对象B,他们想死的部分又可以抽象出来,成为父亲,这就是继承。
模态框
通过继承的方式得到父类的所有特性,子类可以使用父级的部分属性和方法,而且可以扩展。
extends
当一个子类重写了构造函数,name子类构造函数中必须通过super调用父类构造函数,否则报错。
如果子类没重写构造函数(不去改动constructor),则不需要调用
继承了父类特性以后,可以加上子类自己的一些逻辑(属性和方法)
super代表父类
设计模式
单例,工厂,订阅者,
构造函数
js中面向对象并不是基于类的,es6的class只是语法糖,引擎在解析的时候还是会把class解析成es6之前的构造函数。typeof一个class就可以看出来,实际上是function
class Person => function Person
class Person中的constructor函数 => 转换后的function Person
class Person{constructor(){console.log(111)}}
function Person(){console.log(111)}
以上两者是同义的
() 放在末尾为函数调用运算符
==new 一元运算符== 核心作用:实例化对象
new的运算数是一个函数
function Person()
var p1 = new Person | var p2 = new Person()
当函数没有参数时,这两种写法是一毛一样的!
构造器是用来创建对象的函数,如果一个函数返回的是对象,他就是一个构造函数。
💡
用new+函数方式赋值给变量,会隐式返回一个对象,不需要刻意写return,
- 如果没有return或刻意写的return不是一个对象的时候,返回一个默认对象
- 显式return的是一个对象的时候,返回你刻意写的return
通过new执行的函数,函数内的this即执行这个函数完成后返回的对象。
1 | let _this; |
==有的函数不能new,例如Symbol,无法new Symbol== 或者静态方法(直接用类型调用的,例如Object.keys)都无法new
包装对象
数据类型:基础数据类型 | 复合数据类型
对象是由其他简单数据类型综合而成的一种复合数据。
对象这样的数据才有属性和方法;虽然简单数据类型没有属性和方法,但对这些数据进行的操作是很常见的需求,例如“abc”.length
三个构造函数 Number String Boolean,通过这三个构造函数创建出来与三种简单类型数据相似的包装对象,类型为object
字面量形式创建的简单类型,为了能使它们也能通过调用属性和方法的方式来操作(像对象这样),
当我们调用一个普通数据类型的某个属性或方法时,js会根据这个普通数据所拥有的类型对实例化对应的构造函数,并以这个普通数据值作为参数,实例化一个与之对应的对象,再调用这个对象对应的属性或方法,且返回这个属性或方法的值。
str = ‘abc’
str.length => string类型 => (new String(str)).length
let str3 = “abc” | let str4 = new String(“abc”)
str3.a = 10; str4.a = 10;
打印str3.a和str4.a 结果是啥?
str3.a 根本无法添加属性,打印str3.a 其实是打印一个临时创建的对象的a (new String(str3)).a
那肯定是 嗯 你懂的
