6

首先,如果这是一个愚蠢的问题,我很抱歉。我在下面写了两个代码片段。从这里找到的第一个代码片段是由我编写的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);

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

4

1 回答 1

7

在对象的原型上而不是在构造函数中定义方法的主要原因是,原型中定义的方法立即可供对象的所有实例(在内存中)使用和共享。

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

不过要清楚一点,通过在对象实例之间共享,我并不是说该方法静态地对其访问的任何属性进行操作。这些属性(如果用 定义this.)仍然是特定于实例的。只是您最终不会定义同一方法的多个副本。

于 2012-04-14T19:37:50.837 回答