考虑下面的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
答案 0 :(得分:1)
从方法的文档字符串:
设置原型,构造函数和超类的实用程序 用于支持可以链接的继承策略的属性 构造函数和方法。 不会继承静态成员。
强调我的。
当您使用示例中的extend()
方法时,继承链将如下所示:
superclass constructor
+-------------------------------+ ----------------> class2()
| | /
| +---------+ | / +---------+
v proto | | |/ proto | |
{ } <-------| class1 | { } <-------| class2 |
| | | | | |
| +---------+ | +---------+
v | v
testMethod() | testMethod()
v
factory()
如果您希望可以从class2访问factory()
,则必须将其粘贴在class1.prototype
上。