【问题标题】:Using a prototype pattern in a closure在闭包中使用原型模式
【发布时间】:2011-09-27 09:57:20
【问题描述】:

我一直在摆弄 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,它确实显示了性能上的很大差异,但我不知道为什么。

【问题讨论】:

    标签: javascript oop closures prototypal-inheritance


    【解决方案1】:

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

    如果你想创建很多这样的对象,你应该只创建一个原型对象并将它用作你创建的所有对象的原型。

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 2021-05-07
      • 2012-12-29
      • 1970-01-01
      • 2012-09-28
      • 1970-01-01
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      相关资源
      最近更新 更多