初次看些JS代码时会发现xxFucObject.superclass.constructor.call的使用,咋看以为JS什么时候增加了superclass这个object预定义属性, 可是并没有。constructor, call的使用可以查询
/********************** call() 方法 call() 方法是与经典的对象冒充方法最相似的方法。它的第一个参数用作 this 的对象。其他参数都直接传递给函数自身。例如: **********************/ function sayColor(sPrefix,sSuffix) { alert(sPrefix + this.color + sSuffix); }; var obj = new Object(); obj.color = "blue"; sayColor.call(obj, "The color is ", " a very nice color indeed."); //输出: The color is blue a very nice color indeed
object固有的属性和方法:
/*****Object 对象具有下列属性:*******/ constructor //对创建对象的函数的引用(指针)。对于 Object 对象,该指针指向原始的 Object() 函数。 Prototype //对该对象的对象原型的引用。对于所有的对象,它默认返回 Object 对象的一个实例。 /*****Object 对象还具有几个方法:*******/ hasOwnProperty(property) //判断对象是否有某个特定的属性。必须用字符串指定该属性。(例如,o.hasOwnProperty("name")) IsPrototypeOf(object) //判断该对象是否为另一个对象的原型。 PropertyIsEnumerable //判断给定的属性是否可以用 for...in 语句进行枚举。 ToString() //返回对象的原始字符串表示。对于 Object 对象,ECMA-262 没有定义这个值,所以不同的 ECMAScript 实现具有不同的值。 ValueOf() //返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。
那么superclass肯定是你的JS程序引用了第三方JS LIB,并且其给Function对象增加了这个属性。如果百度google下就会发现一些已知的LIB,如YUI,extJS。这里可以参考下YUI的extend方法,其用法如下。
var Class1 = function(){ this.a1 = 1; this.a2 = 2; }; Class1.prototype.fun1 = function(){}; var Class2 = function(){ Class2.superclass.constructor.call(this); //这里要用对象伪装的方式执行superclass.constructor.call,有参数则加参数 }; YAHOO.extend(Class2,Class1); var t1 = new Class2();
这里有个JS的晚绑定概念,所以看惯了JAVA或其他面向对象语言,看这段代码时总会有点疑惑。YAHOO.exend方法在继承时会给子类赋值superclass这个属性。如果上面的代码没有调用YAHOO.extend应该会有undefined superclass类似的错误。
YAHOO.extend源码如下:
/** * Utility to set up the prototype, constructor and superclass properties to * support an inheritance strategy that can chain constructors and methods. * * @method extend * @static * @param {Function} subc the object to modify * @param {Function} superc the object to inherit * @param {Object} overrides additional properties/methods to add to the * subclass prototype. These will override the * matching items obtained from the superclass * if present. */ extend: function(subc, superc, overrides) { var F = function() {}; F.prototype=superc.prototype; subc.prototype=new F(); subc.prototype.constructor=subc; subc.superclass=superc.prototype; if (superc.prototype.constructor == Object.prototype.constructor) { superc.prototype.constructor=superc; } if (overrides) { for (var i in overrides) { subc.prototype[i]=overrides[i]; } } },