初次看些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];
            }
        }
    },
    

 

发表评论