现在的位置: 首页 > 综合 > 正文

javascript面向对象继承方式分享

2013年01月07日 ⁄ 综合 ⁄ 共 2499字 ⁄ 字号 评论关闭

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!");

 

 

抱歉!评论已关闭.