2011-07-02 36 views
2

我一直在Javascript中使用原型和闭包模式来摆弄一下。您可能知道,使用闭包模式时有一个performance penalty,因为它为对象的每个实例重新定义了相同的函数。然而,闭包模式确实允许私有变量,这使得封装更容易。在闭包中使用原型模式

这里的原型模式的一个典型的例子:

function Foo(val) { 
    this.val = val; 
} 

Foo.prototype.getVal = function() { 
    return this.val; 
} 

var f = new Foo(42); 

我就在想,为什么你不能做这样的事?

function Parent() { 

} 

Parent.prototype.getVal = function() { 
    return this.val; 
} 

function foo(val) { 
    function Obj { 
     this.val = val; 
    } 

    Obj.prototype = new Parent(); 

    return new Obj(); 
} 

var f = foo(42); // Note the missing 'new' 

这允许在foo()函数中使用私有变量,甚至可以在foo()函数中动态设置原型。

我做了一个jsperf.com test哪个indeeds表现出很大的性能差异,但我不知道为什么。

回答

2

性能的差异很可能是因为您创建两个对象而不是一个。您正在创建一个额外的对象,仅用作另一个对象的原型。

如果您想要创建许多像这样的对象,只需创建一个原型对象并将其用作您创建的所有对象的原型。