OOP javascript和简单类实例化

时间:2012-04-14 19:34:07

标签: javascript oop

首先,如果这是一个愚蠢的问题,我很抱歉。我已经写了两个代码片段。从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);

修改版

{{1}}

为什么我应该使用对象的原型来添加方法(在创建实例之后)而不是在构造函数中写入它?

1 个答案:

答案 0 :(得分:7)

在对象的原型而不是在构造函数中定义方法的主要原因是原型中定义的方法可立即用于共享(在memory)对象的所有实例。

通过在构造函数中定义方法,该方法特定于创建它的对象的实例。如果你实例化10个你的对象,你将在内存中有10个副本,即使它们都是相同的,直到你修改其中一个。

要明确的是,通过对象实例中的 shared ,我并不是说该方法在其访问的任何属性上静态运行。这些属性(如果使用this.定义)仍然是特定于实例的。只是你不会最终定义同一方法的多个副本。