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

查看:117
本文介绍了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

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

注意我这里创建对象的方式是直接调用 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 从此不再疑惑

这篇关于JavaScript面向对象的写法中为什么喜欢在原型对象添加init函数,在函数里添加对象属性,然后构造函数再apply()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆