102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!--
 | 
						||
 * @Author: Kane
 | 
						||
 * @Date: 2022-11-02 11:22:37
 | 
						||
 * @LastEditors: Kane
 | 
						||
 * @LastEditTime: 2022-11-03 14:44:57
 | 
						||
 * @FilePath: \car_dealer\vue\keypath.html
 | 
						||
 * @Description: 
 | 
						||
 * 
 | 
						||
 * Copyright (c) ${2022} by Kane, All Rights Reserved. 
 | 
						||
-->
 | 
						||
<!DOCTYPE html>
 | 
						||
<html lang="en">
 | 
						||
 | 
						||
<head>
 | 
						||
    <meta charset="UTF-8" />
 | 
						||
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
 | 
						||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
						||
    <title>keypath测试</title>
 | 
						||
</head>
 | 
						||
 | 
						||
<body></body>
 | 
						||
<script>
 | 
						||
    const keypathReg = /[^\w.$]/;
 | 
						||
 | 
						||
    let a = {
 | 
						||
        b: {
 | 
						||
            c: {
 | 
						||
                d: 100,
 | 
						||
            },
 | 
						||
        },
 | 
						||
    };
 | 
						||
 | 
						||
    function parsePath(path) {
 | 
						||
        if (keypathReg.test(path)) {
 | 
						||
            return;
 | 
						||
        }
 | 
						||
 | 
						||
        const segments = path.split(".");
 | 
						||
 | 
						||
        return function (obj) {
 | 
						||
            console.log(segments);
 | 
						||
            for (let i = 0; i < segments.length; i++) {
 | 
						||
                // console.log(segments.length);
 | 
						||
 | 
						||
                if (!obj) {
 | 
						||
                    //如果obj没有值,就返回
 | 
						||
                    return;
 | 
						||
                }
 | 
						||
 | 
						||
                obj = obj[segments[i]];
 | 
						||
            }
 | 
						||
 | 
						||
            return obj;
 | 
						||
        };
 | 
						||
    }
 | 
						||
 | 
						||
    let obj = parsePath("b.c.d");
 | 
						||
 | 
						||
    console.log(obj.call(a, a));
 | 
						||
</script>
 | 
						||
<script>
 | 
						||
    class Dep {
 | 
						||
        constructor() { }
 | 
						||
 | 
						||
        depend() { }
 | 
						||
 | 
						||
        notify() { }
 | 
						||
    }
 | 
						||
 | 
						||
    /**
 | 
						||
     * data 要添加响应式的对象
 | 
						||
     * key 要设置为响应式的属性
 | 
						||
     * val 属性的值
 | 
						||
     */
 | 
						||
    function defineReactive(data, key, val) {
 | 
						||
        if (typeof val === "Object ") {
 | 
						||
        }
 | 
						||
 | 
						||
        let dep = new Dep();
 | 
						||
 | 
						||
        Object.defineProperty(data, key, {
 | 
						||
            enumerable: true,
 | 
						||
            configurable: true,
 | 
						||
            get: function () {
 | 
						||
                dep.depend();
 | 
						||
 | 
						||
                return val;
 | 
						||
            },
 | 
						||
            set: function (newVal) {
 | 
						||
                if (val === newVal) {
 | 
						||
                    return;
 | 
						||
                }
 | 
						||
 | 
						||
                val = newVal;
 | 
						||
 | 
						||
                dep.notify();
 | 
						||
            },
 | 
						||
        });
 | 
						||
    }
 | 
						||
</script>
 | 
						||
 | 
						||
</html> |