YUI:YAHOO.lang.extend将“静态”方法带到子类是否有意义?

时间:2009-10-16 22:29:41

标签: javascript yui

考虑下面的JavaScript代码,灵感来自YAHOO.lang.extend上的YUI文档。

在这段代码中,Class1有一个名为factory()的“静态方法”(因为它是一种对象工厂)。 Class2使用YAHOO.lang.extend继承自Class1。为什么不在Class2中自动定义factory()?这是一个合理的期望,还是有更好的方法来做到这一点?

YAHOO.namespace("test");

YAHOO.test.Class1 = function() {};
YAHOO.test.Class1.factory = function() { console.log("Class1 static"); }
YAHOO.test.Class1.prototype.testMethod = function(info) { console.log("Class1: " + info); };

YAHOO.test.Class2 = function(info) { YAHOO.test.Class2.superclass.constructor.call(this, info); };
YAHOO.lang.extend(YAHOO.test.Class2, YAHOO.test.Class1);
YAHOO.test.Class2.prototype.testMethod = function(info) { console.log("Class2: " + info); };

YAHOO.test.Class1.factory(); // Works fine
YAHOO.test.Class2.factory(); // "Static method" is not inherite 

1 个答案:

答案 0 :(得分:1)

从方法的文档字符串:

  

设置原型,构造函数和超类的实用程序      用于支持可以链接的继承策略的属性      构造函数和方法。 不会继承静态成员。

强调我的。

当您使用示例中的extend()方法时,继承链将如下所示:

                superclass                constructor
    +-------------------------------+    ----------------> class2()
    |                               |  /            
    |          +---------+          | /        +---------+
    v    proto |         |          |/   proto |         |
   { } <-------|  class1 |         { } <-------|  class2 |
    |          |         |          |          |         |
    |          +---------+          |          +---------+
    v              |                v           
testMethod()       |            testMethod()      
                   v                            
               factory()

如果您希望可以从class2访问factory(),则必须将其粘贴在class1.prototype上。