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-02 14:47:32
							 | 
						|||
| 
								 | 
							
								 * @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>
							 |