js 魔鬼训练

1、Object.assign 偷梁换柱 / 融合
  - 将多个对象合并到第一个对象中去。这样一来methods对象中就包含着data对象了。否则this无法正常访问data中的title
var news={
  data(){
      return {
          id:101,
          title:"新闻标题"
      }
  },
    methods:{
        show()
        {
            alert(this.title)
        }
    }
};
 Object.assign(news.methods,news.data())
 news.methods.show()
  

 2、限制与规则

var God={
    version:"1.0",
    extends(name,obj) {
        if("data" in obj && "methods" in obj && typeof obj.data=="function" && typeof obj.methods=="object" ) {
            var getData=obj.data();
            if(typeof getData=="object") {            
                Object.assign(obj.methods,getData);
                this[name]=obj;
            }
        }
    }
};


var news={
    data () {
      return {
          id:101,
          title:"新闻标题"
      }
    },
    methods:{
        show() {
            alert(this.title)
        }
    }
};

 God.extends("news",news);
 God.news.methods.show()

 3、 Object.defineProperty 设置属性为不可枚举

var God={
    version:"1.0",
    extends(name,obj)
    {
        this.init();
        if("data" in obj && "methods" in obj && typeof obj.data=="function" && typeof obj.methods=="object" )
        {
            var getData=obj.data();
            if(typeof  getData=="object")
            {
                Object.assign(obj.methods,getData,this);//把传入对象的Data 合并进入对象的methods
                this[name]=obj; //给GOD对象设置一个属性 (根据参数和参数值)
            }
        }
    },
    init() //初始化
    {
        Object.defineProperty(this,"init",{
            enumerable:false  //设置属性为不可枚举
        })
        Object.defineProperty(this,"extends",{
            enumerable:false
        })

        var keys=Object.keys(this);
        this.$global={};
        keys.forEach((key)=>{
            this.$global[key]=this[key];
        });
    }
};

 

posted @ 2017-01-09 20:59  贝尔塔猫  阅读(232)  评论(0编辑  收藏  举报