面向对象
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
2
3
4
5
6
class Modal{
render(){
button.onclick = this.close.bind(this);
}
close(){this.xxxx.remove()//关闭};
}

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
2
3
4
5
6
7
let _this;
function fn(){
console.log(this);
_this = this;
}
let f1 = new fn()
console.log(f1==_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

那肯定是 嗯 你懂的

Author: superman285
Link: https://skr.dog/2018/12/14/面向对象/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.