设计模式——原型链模式之在原型上设置属性

function Fn(num) {
this.x = num;
}
一、给Fn.prototype起一个别名

     var pro = Fn.prototype;
        pro.getX = function () {
    
        }
        pro.setX = function () {
    
        }
        pro.removeX = function () {
    
        }

  

二、手动创建一个新的内存给Fn.prototype
1)一定要注意,我们自己创建的堆内存会把浏览器默认创建的那个给覆盖掉,所以之前在原型上写的方法就不在存在了
解决方法:我们在创建之前把原来的保留下来,在创建完成后,再循环原来的所有,一个个的添加到新的堆内存当中,这样就避免了把原来覆盖掉

       function Fn() {
    
        }
     Fn.prototype.a = function () {
      console.log(0);
    } Fn.prototype.b = function () { console.log(1); }; var pro = Fn.prototype; Fn.prototype = { constructor: Fn, b: function () { console.log(2); }, c: function () { }, //recover是在不知道原有类的原型上是否存在方法的时候,我们编写一个还原原有公有属性方法的函数,非必须加的内容 recover: function () { for (var key in pro) { //为了防止原有的方法,把自己写的方法在还原时候覆盖掉,我最好把自己的方法名进行修改 if (key in this) { this["my" + key] = this[key]; this[key] = null; } this[key] = pro[key]; } } }; Fn.prototype.recover(); var f = new Fn;
f.b(); --> 1

  控制台console.dir(Fn.prototype); 得出下图:b是原来原型上的,myb是自己手动添加的b,然后经过recover将名字改成了myb,即保留了原有原型上的方法,也解决了覆盖问题

  



2)自己创建的对象中是不会默认自带constructor的,所以当我们输出f.constructor的结果是Object
这样的话就修改了constructor默认指向自己类本身的机制,为了防止修改,我们采用这种办法设置公有的属性和方法的时候,千万不要忘记自己手动添加constructor,让其指向当前Fn这个类本身
var f = new Fn;
console.log(f.constructor); -->function Fn() { }

 

转载于:https://www.cnblogs.com/cataway/p/5007139.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值