Mardanjan / Blog

学习笔记(在issues里),一些小demo的源码在这里,demo在线地址会持续更新
1 stars 0 forks source link

JavaScript:面向对象的特性及用JavaScript实现 #41

Open Mardanjan opened 4 years ago

Mardanjan commented 4 years ago

函数模仿面向对象

// 用函数模仿面向对象的编程方式
    function Person (name) {
        this._name = name
        this.getName = function() {
            console.log(this._name)
            return this._name
        }
        this.setName = function (name) {
            this._name = name
        }
    }
    let p = new Person('Maierdan')
    p.getName()
    p.setName('张三')
    p.getName()

es6提供的书写方式

// es6的新提供的书写方式,这种方式更接近面向对象的书写方式
    class Person {
        // 构造方法
        constructor(name) {
            this._name = name
        }
        getName () {
            console.log(this._name)
            return this._name
        }

        setName(name) {
            this._name = name
        }
    }
    let p = new Person('mardan')
    p.getName()
    p.setName('啦啦')
    p.getName()

面向对象的三大特征

 // es6 继承的书写方式
    class Father {
        // 构造函数
        constructor(name) {
            this._name = name
        }
        // 实例方法,通过实例对象去调用
        getName () {
            console.log(this._name)
            return this._name
        }
        // 静态属性不会被继承,并且通过类名去调用的
        static hitXiaoming() {
            console.log('打小明')
        }
    }

    class Child extends Father {
        constructor(name, age) {
            // 实例化子类的时候把子类的数据传给父类
            // super关键字:用于访问对象上的函数
            super(name)
            this._age = age
        }
    }

    let daming = new Father('大名')
    Father.hitXiaoming()
    console.log(Father.hitXiaoming)
    daming.getName()
    console.log(daming.hitXiaoming)

    let xiaoming = new Child('小明', '1222')
    xiaoming.getName()
    console.log(xiaoming._age)
    console.log(xiaoming.hitXiaoming)

多态

class Father {
        constructor(name) {
            this._name = name
        }
        getName () {
            console.log(this._name)
            return this._name
        }
        work () {
            console.log('我是父类的work方法')
        }
    }

    class Son extends Father  {
        constructor(name, age) {
            super(name)
            this._age = age
        }

        getAge () {
            console.log(this._age)
            return this._age
        }

        work () {
            console.log('我是子类的work方法')
        }
    }
    let f = new Father('Father')
    f.getName()
    f.work()
    let s = new Son('son', 'age')
    s.getName()
    s.getAge()
    s.work()

三大特征的优点

Mardanjan commented 4 years ago

new操作符将函数作为构造器进行调用的过程

Mardanjan commented 4 years ago

proto 的作用

Mardanjan commented 4 years ago

proto 和 constructor

Mardanjan commented 4 years ago

prototype

补充

Mardanjan commented 4 years ago

参考的博文