• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
我的成长足迹
夫志当存高远
博客园    首页    新随笔    联系   管理    订阅  订阅

javascript面向对象继承方式分享

1、javascript的大段文本块声明 2、Douglas Crockford《在JavaScript中实现基于类模式的继承 》实现的一个巧妙地继承方法 3、dean edwards base.js的类继承方式

1、javascript的大段文本块声明

 1 $(document).ready(
 2       function ()
 3       {
 4           var str = '\
 5           helo me fdsaf fdsaf\
 6           me\
 7           \
 8           test\
 9           ';
10           alert(str);
11       }
12     );
13 

 

这个和@大大柳树 曾经遇到过该问题。

2、Douglas Crockford实现的一个巧妙地类模式的继承。加了些注释方便理解。

理解这段函数需要的基础知识

(1)、Function.prototype增加一个公有方法。所有由类的扩充的函数都可以使用它。它有一个名称和一个函数,并把它们增加到了函数的prototype上。

(2)、if,while 这些需要判断函数的语句,数字0作为条件转换为false,>0转换为true。

 

实现继承函数
//辅助方法
Function.prototype.method = function (name, func) {
    
this.prototype[name] = func;
    
return this;
};
//比较复杂的函数= =
//
可以实现快捷的继承。也可以让选择性的调用父对象的函数。
Function.method('inherits', function (parent) {
    
var d = {};
    
this.prototype = new parent();
    
var p = this.prototype;
    
//一个特权方法可以调用父类的方法。
    this.method('uber', function uber(name) {
        
//判断该方法是否存在
        if (!(name in d))
        {
            d[name] 
= 0;
        }
        
var f, r, t = d[name], v = parent.prototype;
        
//是否执行过
        if (t)
        {
            
//如果有执行过
            while (t)
            {
                v 
= v.constructor.prototype;
                t 
-= 1;
            }
            f 
= v[name];
        }
        
//首次执行
        else
        {
            f 
= p[name];
            
//如果指向当前原型的方法,调用父对象的方法
            if (f == this[name])
            {
                f 
= v[name];
            }
        }
        
//巧妙而恶心的调用堆栈记录
        d[name] += 1;
        //这个函数也很巧妙,arguments不是一个真正的数组,所以必须再一次使用apply来调用数组的slice的方法。
        r = f.apply(this, Array.prototype.slice.apply(arguments, [1]));
        alert(d[name]);
        
return r;
    });
    
return this;
});
//只继承父类特定函数的辅助函数
Function.method('swiss', function (parent) {
    
for (var i = 1; i < arguments.length; i += 1)
    {
        
var name = arguments;
        
this.prototype[name] = parent.prototype[name];
    }
    
return this;
}

 

 

 

 

调用代码
function User() {
    
this.name = "user";
}
User.method(
"sayYouName", function () { alert("from:" + this.name); });
function Man() {
    
this.name = "man";
}
Man.inherits(User);
Man.method(
"sayYouName",
function () {
    
this.uber("sayYouName");
    alert(
"and i am man");
});

 3、dean edwards base.js的类继承方式

这个类继承的方式会更优雅些,如果方法被覆盖的情况下更是如此,只需this.base调用即可。不用显示写出方法名

 

代码
//base.js begin
var Star = Base.extend({
    constructor: function (name) {
        
this.name = name;
    },
    name: 
"",
    say: function (message) {
        alert(
this.name + ": " + message);
    }
});

var Sun 
= Star.extend({
    say: function (message) {
        
this.base(message);
        alert(
"base over");
    }
});

 

 

调用代码

 

(new Sun("tom")).say("hello world!");

 

 

posted @ 2011-01-05 23:37  bwbwbw1984  阅读(262)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3