【问题标题】:JavaScript equivalent of this small PHP codeJavaScript 等价于这个小的 PHP 代码
【发布时间】:2013-07-12 19:45:53
【问题描述】:

我想要一个“静态”方法“create”,它在我的 JavaScript 代码中返回一个“类”的新实例。

在 PHP 中我会这样做:

abstract class Object {
    public static function create() {
        return new static;
    }
}

class Foo extends Object { }

$foo = Foo::create();

在 JavaScript 中我有:

var Object = function() { };

var Foo = function() { };
Foo.prototype = new Object;

我希望能够做到:

var foo = Foo.create();

有可能吗?如果是,我应该添加什么?

感谢您的帮助。

【问题讨论】:

  • 对象可能已被保留,但假设这只是示例。
  • @JonathanLonowski: Boolean 不是继承自 Object,它继承自 Object.prototype,这是一个完全不同的对象...
  • 是的,但是object也不继承自Object,它们继承自Object.prototype,这不一样。对象有很多静态方法,比如没有出现在对象上的 keys()...
  • @JonathanLonowski:我同意这一点,但不同意支持它的不正确陈述。这东西有点令人困惑,可能是因为 JS 中没有足够的保留字来像其他语言那样具体说明模式......

标签: php javascript class inheritance static


【解决方案1】:

它实际上非常简单,尽管关于什么是“静态”可能会混淆语义:

function Foo(){
  this.bar=true;
}

Foo.create= function(){ return new this; };

var foo = Foo.create();

根据 OP 需求,替代版本适用于所有构造函数:

function Foo(){
  this.bar=true;
}

Function.prototype.create= function(){ return new this; };

var foo = Foo.create();

【讨论】:

  • 感谢您的回答,但这不是我想要的。您的解决方案涉及为每个子类创建一个创建方法,我希望自动完成。
  • 好的,感谢您的澄清。我会在编辑答案时做得更好。
  • 这将是要走的路,尽管我认为 OP 也希望同时设置继承(不仅仅是来自Object.prototype 的自动交互)
  • @CrazyTrain:这是做他想做的最少的代码,它是一个起点,因为它不能再简单了。有足够的空间来调用 Object.create 或任何需要的东西。这只是一个没有使用硬编码名称的模板来发挥它的魔力,让它可以应用到任何地方。
  • 谢谢,但你确定这行得通吗?在我看来,它将为 Foo 类的每个实例添加一个非静态方法“create”,而不添加静态方法。
【解决方案2】:

我不确定这是否是您所追求的,但它可能会有所帮助。

var Foo = {
    create: function () {
        function F() {}

        // Add any default properties/methods/etc.
        F.prototype.bar = true;
        F.prototype.dr = function() { return "Pepper"; };

        // Return a new object containing defaults listed above
        return new F();
    }
};

var baz = Foo.create();

【讨论】:

    猜你喜欢
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2011-07-23
    相关资源
    最近更新 更多