第八章TypeScript class类

重点

implements 约束class类的

readonly 只能给属性用,只能读取

private 只能在内部使用

protected 给子类和内部去使用

public 哪里都能使用

super

父类的 prototype.constructor.call

static

可以给方法也可以给属性是一个静态方法 他的this指向的是 static

javascript 复制代码
// 1.class 的基本用法 继承 和 类型约束 implements
// 2.class 的修饰符 readonly private public protected
// 3. super 原理
// 4.静态方法 static
// 5. get set

// 重点
// implements 约束class类的
// readonly 只能给属性用,只能读取
// private 只能在内部使用
// protected 给子类和内部去使用
// public 哪里都能使用
// super
// 父类的 prototype.constructor.call
// static
// 可以给方法也可以给属性是一个静态方法
// 他的this指向的是 static


interface Options {
    el: string | HTMLElement
}

interface VueClas {
    options: Options

    init(): void
}

interface Vnode {
    tag: string // div section header
    text?: string//123
    children?: VNode[]
}

class Dom {
    // 创建节点的方法
    private createElement(el: string) {
        return document.createElement(el)
    }

//     填充文本的方法
    private setText(el: HTMLElement, text: string | null) {
        el.textContent = text
    }

//     渲染函数
    protected render(data: Vnode) {
        let root = this.createElement(data.tag)
        if (data.children && Array.isArray(data.children)) {
            data.children.forEach((item) => {
                let child = this.render(item)
                root.appendChild(child)
            })
        } else {
            this.setText(root, data.text)
        }

        return root
    }
}


class Vue extends Dom implements VueClas {
    readonly options: Options

    constructor(options: Options) {
        super()
        this.options = options
        this.init()
    }

    static xx() {

    }

    static version() {
        return '1.0.0'
    }

    init(): void {
        let data: Vnode = {
            tag: "div",
            children: [
                {
                    tag: "section",
                    text: "我是子节点1"
                },
                {
                    tag: "section",
                    text: "我是子节点2"
                },
                {
                    tag: "section",
                    text: "我是子节点3"
                }
            ]
        }
        let app = typeof this.options.el == 'string' ? document.querySelector(this.options.el) : this.options.el
        app.appendChild(this.render(data))
    }
}

new Vue({
    el: "#app"
})


// set get
class Ref {
    _value: any

    constructor(value: any) {
        this._value = value
    }

    // 这个地方的value和上面的value的不能重复
    get value() {
        return this._value + 'hm'
    }

    set value(newValue) {
        this._value = newValue + '鹤鸣'
    }
}


const ref = new Ref('鹤鸣')
console.log(ref.value) // 输出结果 鹤鸣hm
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app"></div>
<script src="./index9.js"></script>
</body>
</html>
相关推荐
网络点点滴7 分钟前
watch监视-ref基本类型数据
前端·javascript·vue.js
西洼工作室17 分钟前
前端接口安全与性能优化实战
前端·vue.js·安全·axios
大布布将军17 分钟前
《前端九阴真经》
前端·javascript·经验分享·程序人生·前端框架·1024程序员节
幸运小圣19 分钟前
for...of vs for 循环全面对比【前端JS】
开发语言·前端·javascript
_志哥_1 小时前
深度解析:解决 backdrop-filter 与 border-radius 的圆角漏光问题
前端·javascript·html
qiao若huan喜2 小时前
10、webgl 基本概念 + 坐标系统 + 立方体
前端·javascript·信息可视化·webgl
Crystal3282 小时前
App端用户每日弹出签到弹窗如何实现?(uniapp+Vue)
前端·vue.js
摸着石头过河的石头2 小时前
Service Worker 深度解析:让你的 Web 应用离线也能飞
前端·javascript·性能优化
molly cheung3 小时前
Vue3:watch与watchEffect的异同
vue.js·watch·store·watcheffect
不爱吃糖的程序媛3 小时前
Electron 如何判断运行平台是鸿蒙系统(OpenHarmony)
javascript·electron·harmonyos