OOP javascript和简单的类实例化(OOP javascript and Simple C

2019-07-28 23:41发布

首先,我很抱歉,如果这是一个愚蠢的问题。 我写的波纹管两个代码段。 从找到的第一个代码片段在这里写了John Resig ,毫无疑问他的最好成绩之一和第二代码片段是由我从原始代码修改只能理解上的差异,但我不知道其实是什么都之间的差异我能做和不能做既比较。 请人帮我理解上的差异。 谢谢。

    function makeClass(){
        return function(args){
            if ( this instanceof arguments.callee ) {
                if ( typeof this.init == "function" )
                    this.init.apply( this, args.callee ? args : arguments );
                }
                else  return new arguments.callee( arguments );
        };
    }
    var User = makeClass();
    User.prototype.init = function(first, last){
      this.name = first + " " + last;
    };
    var user = User("John", "Resig");
    console.log(user);

修改版

    function myClass(args)
    {
        if (this instanceof arguments.callee) 
        {
            this.init = function(first, last){
                this.name = first + " " + last;
            };
            this.init.apply( this, args.callee ? args : arguments );
        }
        else    return new arguments.callee( arguments );
    }
    var obj = new myClass('Sheikh', 'Heera');
            console.log(obj);

为什么要使用对象的原型添加一个方法,而不是写它的构造函数中(使一个实例之后)?

Answer 1:

一个主要的原因,以限定在对象的原型,而不是在构造一个方法是,在原型中定义的方法是立即可用 ,并通过 (在存储器中)的对象的所有实例共享

通过在构造限定的方法,该方法是专用于创建它的对象的实例。 如果您insantiate对象的10,你就会有方法的10个拷贝在内存中,即使他们都是一样的,直到你修改其中的一个。

需要明确的是,虽然,通过对象实例间共享的 ,我的意思并不是说,它的方法访问任何属性静态操作。 这些属性(如果有定义的this. )仍特定实例。 这只是你没有最终定义相同的方法的多个副本。



文章来源: OOP javascript and Simple Class Instantiation