JS面向对象

面向对象编程

new 运算符

  1. 执行函数;
  2. 自动创建空对象
  3. 把创建的对象指向另一个对象
  4. 吧空对象和函数里的this衔接起来(this指向实例化对象)
  5. 隐式返还this
1
2
3
4
5
6
7
8
function test(){
console.log("test....")
}

test();
new test;
new test();
//这三种方法执行效果相同

简化工厂模式 —–> 构造函数

  • 约定俗成 : 首字母大写

  • 属性放在构造原型;方法放在原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function Tab(){
// let obj = {}; ---> this
// obj.name = "张三";
// obj.hobby = function(){
this.name = "张三";
this.hobby = function(){
console.log("篮球");
}
// return obj;
}
let tab1 = new Tab();

console.log(tab1.__proto__===Tab.prototype) //true
console.log(Tab.prototype.__proto__===Object.prototype) //true
console.log(Object.prototype.__proto__) //null

Tab.prototype.psFor = function(){
console.log('psFor...')
}

let tab2 = new Tab();
console.log(tab1.psFor === tab2.psFor) // true

Tab.prototype.foods = function(){
console.log(this.name,'foods...')
}

tab1.foods()

每个原型上都有一个预定义属性 : constructor
覆盖原本的 constructor 属性
用以下写法必须要写constructor,不然会找不到对象的原型指向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Tab.prototype={
constructor:Tab,
psFor(){
console.log('psFor...')
},
hobby(){
console.log('hobby...')
}
}

let str = '123saar'
if(str.constructor===String){
console.log("字符串")
}else{
console.log("不是")
}
//字符串

es6 类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Drag{
static height = "178cm"; //静态属性 也可以这样写静态方法
constructor(age){
this.name = "张三"
this.age = age
}
hobby(){
console.log("篮球")
}
setStyle(){
console.log("父类逻辑")
}
testSuper(){
console.log("父类test逻辑")
}
}

Drag.test = function(){ //静态方法 也可这样写静态属性
console.log('test...')
}

Drag.test()

console.log(Drag.height) //178cm

console.log(typeof Drag) //function
let drag1 = new Drag()

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class LimitDrag extends Drag{
constructor(age){
super(age);
}
setStyle(){
console.log("子类逻辑")
}
testSuper(){
super.testSuper() //调用父类
console.log("子类test逻辑")
}
}
let drag2 = new LimitDrag(20)


console.log(LimitDrag.height) //178cm 静态属性方法在类上继承
console.log(drag2.height) //undefined

drag2.setStyle() //子类逻辑
drag2.testSuper() //父类test逻辑 子类test逻辑

//构造函数的属性和方法通过实例化对象继承
文章作者: Joker
文章链接: https://qytayh.github.io/2021/01/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Joker's Blog