autho: selfimpr
blog: http://blog.csdn.net/lgg201
mail: [email protected]
本文博客地址: http://blog.csdn.net/lgg201/archive/2011/02/15/6185846.aspxjavascript中继承的做法: 
1. 子类构造器中以自身对象作为宿主对象对父类进行调用.
function User(username, password) {  
    this.username = username;  
    this.password = password;  
}  
function Admin(username, password, auth) {  
    User.apply(this, arguments);  
    this.auth = auth;  
}  
//当然, 这里面的调用是可以更换为call, 或者直接传递参数的方式, 比如:  
function Admin(username, password, auth) {  
    User.call(this, username, password);  
    this.auth = auth;  
}  
//或者  
function Admin(username, password, auth) {  
    this.__constructor = User;  
    this.__constructor(username, password);  
    delete this.__constructor;  
    this.auth = auth;  
}  
 
2. 原型链: 上面的方法对于父类在构造器外通过prototype设置的成员是无法继承的, 而原型链的方式能够解决这个问题, 并且, 从语法角度来看, 这才是真正的继承, 因为instanceof能够检测到子类对象和父类存在关系.  当然, 这种方式是有缺点的, 那就是只能单继承
function User(username, password) {  
    this.username = username;  
    this.password = password;  
}  
User.prototype.login = function() {  
    alert('user ' + this.username + ' login success');  
}  
function Admin(username, password, auth) {  
    User.apply(this, arguments);  
    this.auth = auth;  
}  
//这里创建一个父类对象, 作为子类的prototype  
Admin.prototype = new User();  
Admin.prototype.login = function() {  
    alert('admin [' + this.username + '] login success, your authentication is: ' + this.auth);  
}  
var admin = new Admin('admin', 'admin', 1986);  
//这里我们测试的是重写父类方法  
admin.login();  
//这里我们测试的是instanceof检测  
alert("admin instanceof Admin: " + (admin instanceof Admin));  
alert("admin instanceof User: " + (admin instanceof User));  
 
3. 上面的原型链方式其实有一点不足, 那就是当我们创建一个Admin的对象之后, 然后获取它的constructor, 得到的是User构造器, 而理想情况下, 这应该是Admin的构造器. 所以, 我们需要对上面的继承再进行少许的修改: 在子类构造器中保留对象对自己构造器的引用
代码如下:
function User(username, password) {  
    this.username = username;  
    this.password = password;  
}  
User.prototype.login = function() {  
    alert('user ' + this.username + ' login success');  
}  
function Admin(username, password, auth) {  
    User.apply(this, arguments);  
    this.auth = auth;  
    //这里保留一次自己的构造器引用  
    this.constructor = arguments.callee;  
}  
//这里创建一个父类对象, 作为子类的prototype  
Admin.prototype = new User();  
Admin.prototype.login = function() {  
    alert('admin [' + this.username + '] login success, your authentication is: ' + this.auth);  
}  
var admin = new Admin('admin', 'admin', 1986);  
//这里我们测试的是重写父类方法  
admin.login();  
//这里我们测试的是instanceof检测  
alert("admin instanceof Admin: " + (admin instanceof Admin));  
alert("admin instanceof User: " + (admin instanceof User));  
//检测对象的构造器是否合适  
alert(admin.constructor);  

解决方案 »

  1.   

    this.constructor = arguments.callee;  
    这个没必要这样吧,每次实例化都分配一个对象属性
    一般是
    Admin.prototype = new User();  
    Admin.prototype.constructor = Admin
      

  2.   


    是昨天写一个小测试的时候需要用到constructor, 今天看到一个继承的文章, 就细看了下继承的过程...
      

  3.   

    一般的继承都是4楼那样的。
    比较方便。
    也有自己定义继承方法的。
    Child.extends = function(Super){
        var $ = new Super;
        for(var p in $)if(!$.hasOwnProperty(p))this[p] = $[p];
    }
      

  4.   

    貌似整错了。
    var extends = function(Super,Child){
      var $ = new Super;
      for(var p in $)if(!$.hasOwnProperty(p))Child.prototype[p] = $[p];
    }
      

  5.   

    prototype.js
    可以借鉴下他里面的创建对象的写法