javascript面向对象-组合使用构造函数和原型模式时在原型对象添加init函数


JavaScript面向对象的写法中为什么喜欢在原型对象添加init函数,在函数里添加对象属性,然后构造函数再apply()


为什么不直接把属性添加进构造函数里,而要apply原型的init函数,让我们一起来探讨这个问题


按照你的描述,我写了一段代码

(function(window) {
    function Fn(param) {
        if(!(this instanceof Fn))
            return new Fn(param);
        return Fn.prototype.init.call(this,param);
    }

    Fn.prototype = {
        constructor: Fn,
        init: function(param) {
            this.param = param;
            return this;
        },
        sayParam: function() {
            console.log(this.param);
        },
        sayContext: function() {
            console.log('this instanceof init: ' + (this instanceof this.init));
            console.log('this instanceof Fn: ' + (this instanceof Fn));
        }
    }

    Fn.prototype.init.prototype = Fn.prototype;
    window.Fn = Fn;
})(window);

var o = Fn('Hello');

o.sayParam()
//Hello
o.sayContext();
//this instanceof init: true
//this instanceof Fn: true

以上代码有三个重点:

  1. 在原型对象的init函数里添加属性,如this.param = param;
  2. 在构造函数里调用原型对象的init方法,即Fn.prototype.init.call(this,param);
  3. 将init函数的prototype设为原型对象,即Fn.prototype.init.prototype = Fn.prototype;


注意我这里创建对象的方式是直接调用 var o = Fn('Hello'); 不是 var o = new Fn('Hello');当然,效果一样,为什么会一样呢?
1 为什么用原型创建对象
通过原型可以让函数只有一个备份,而不是每个对象都有一个备份
2 为什么用 init
在 js 中函数可以当做 构造函数(new Fn())和普通函数来(Fn())来调用,而我写了一个函数让别人去用别人可能不知道这个函数要按那种方式来调用,而在一个函数内部的代码可以分为两部分,第一部分是作为普通函数的执行语句,第二部分是作为构造函数的部分,通过使用 init 来将这两部分来显示的区分职责,在 init 中只做初始化操作 而在 Fn 中可以有其它的计算,通过上面的处理,还有一个好处就是无论用户用那种方式来调用 Fn 都会保证不会出错。(new Fn() 和 Fn() 具有相同的效果)
3 为什么用 apply
你说的 apply 和 call 功能相同,作用是绑定函数的上下文具体,可以参照 JavaScript this 从此不再疑惑


转载自:JavaScript面向对象的写法中为什么喜欢在原型对象添加init函数,在函数里添加对象属性,然后构造函数再apply()







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值