2 个回答

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

(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

将以上代码直接粘贴到浏览器的控制台

注意我这里创建对象的方式是直接调用 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
你说的 applycall 功能相同,作用是绑定函数的上下文具体,可以参照 JavaScript this 从此不再疑惑

貌似是习惯以及以后方便改

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏