设计模式之原型模式

原型模式是快速创建重复对象的一种最佳模式。 这里所说的原型是我们要创建的实例的原始模型,不是js中某个方法或对象的原型属性。

在javaScript中因为需要渲染各种数据,尤其是在使用基于数据驱动的vue或react等框架进行开发时经常会遇到需要数据拷贝的情况。除此之外,关于前端的数据缓存方法的封装等也常常需要考虑到数据的拷贝,原型模式其实在不知不觉间就被使用了。



class ProtypeMain {
    constructor() {
        this.map = new Map();
    }
    setItem(name, item) {
        this.map.set(name, item);
    }
    getItem(name) {
        return this.cloneItem(this.map.get(name));
    }
    cloneItem(obj) {
        let objClone = Array.isArray(obj) ? [] : {};
        if (obj && typeof obj === "object") {
            for (let key in obj) {
                if (obj.hasOwnProperty(key)) {
                    if (obj[key] && typeof obj[key] === "object") {
                        objClone[key] = this.cloneItem(obj[key]);
                    } else {
                        objClone[key] = obj[key];
                    }
                }
            }
        }
        return objClone;
    }
    static isEqual(obj1, obj2) {
        return obj1 === obj2;
    }

}

let pInstance = new ProtypeMain();

let helloStr = "hello world";

let Obj1 = {
    name: "jack", age: 32, child: {
        name: "mike",
        age: 2
    }
}

let obj2 = [2, 3, 5, 7];

pInstance.setItem("hello", helloStr);

pInstance.setItem("jack", Obj1);

pInstance.setItem("mlist", obj2);

let mItem1 = pInstance.getItem("jack");
let mItem2 = pInstance.getItem("jack");

console.log(ProtypeMain.isEqual(mItem1, mItem2)); // false



上边的cloneItem使用了一段自己封装的clone方法,实际开发中尽管es6也给我们提供了Object.assign这样的方法,但是由于其浅复制特性和兼容性问题,被真正使用的并不多。不过好在我们也有$.extend这样经典又好用的工具方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值