虚拟机,编译原理,应用框架

2008年10月31日 #

准备写一个世界第一快的js的css3 selector engine

我在看sizzle和peppy的源代码,发现他们的速度还有提升的空间,

我准备使用jit技术实现一个世界最快的javascript css3 selector engine.

css3选择器也有一些不方便

比如说伪类选择器,只运行"且"选择,不运行"或"选择,要"或"的话,把前面的抄下来吧,效率低多了.

经过jit编译过后的selector成为一个函数,接受一个参数ct,表示容器.选择器将从这个容器开始选择.

该函数执行时,直接引用一些编译期间确定的变量,而且避免函数调用(相当于c++内联函数),合并相邻的伪类选择器.

query函数接受参数ql,ct,rs

ql:查询语句

ct:查询容器

rs:查询结果

query函数首先根据ql和ct查询缓存,如果以前用同样的语句和容器查询过并且文档未改变,则有缓存可以直接返回.

将结果合并到rs返回.

如果不存在缓存则查询是否存在ql编译好的selector的缓存,如果以前编译过一次,那么就不用再编译了,直接用缓存里编译好的.

posted @ 2008-10-31 00:18 文宇祥 阅读(273) 评论(1) 编辑

2008年8月30日 #

javascript OOP:实现继承、多态与封装

代码是随手写的,只提供思路。

这个原理很简单,看代码就懂,不多说了。

 


(function (){
var h = 0;
handle 
= function (){return h++};
var f = function (){};
extend 
= function (a, b){
    f.prototype 
= a;
    
var ret = new f;
    
if (typeof b == 'function') {
        b.call(ret);
    } 
else if (typeof b == 'object') {
        
for (var key in b) {
            ret[key] 
= b[key];
        }
    }
    
return ret;
};
})();

(
function (){
ClassA 
= function (){
    
this.hello = 'world';
};
ClassA.virtualmethod 
= handle();
ClassA.prototype 
= extend({}, function (){
    
this.virtualmethod = function (){
        
var impl = this[ClassA.virtualmethod];
        
if (impl) {
            impl.apply(
this, arguments);
        } 
else {
            alert(
'ClassA.virtualmethod not yet impl.');
        }
    };
});
})();

(
function (){ // ClassB extend ClassA
ClassB = function (){
    ClassA.apply(
this, arguments);
};

// 继承性
ClassB.prototype = extend(ClassA.prototype, function (){
    
this[ClassA.virtualmethod] = function (){
        alert(
'this is ClassA.virtualmethod, impl in ClassB.\nwill show this.hello.');
        alert(
'this.hello = ' + this.hello);
    }
    
    
// 封装性
    this.test = this.virtualmethod;
    
this.virtualmethod = undefined;
});
})();

(
function (){ // ClassC extend ClassB
ClassC = function (){
    ClassB.apply(
this, arguments);
};

ClassC.prototype 
= extend(ClassB.prototype, function (){
    
// 多态性
    var impl = this[ClassA.virtualmethod];
    
this[ClassA.virtualmethod] = function (){
        alert(
'this is ClassA.virtualmethod, impl in ClassC. \nwill run ClassB\'s impl.');
        impl.apply(this, arguments);
    };
});
})();

// test case
var a = new ClassA;
a.virtualmethod(); // not yet impl

var b = new ClassB;
b.test();
alert(
'b.virtualmethod is: '+b.virtualmethod);

var c = new ClassC;
c.test();

posted @ 2008-08-30 23:55 文宇祥 阅读(264) 评论(0) 编辑

2008年8月15日 #

利用xslt扩展html

 

test.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<html>
    
<script>
        var ds = [[1,2,3],[4,5,6],[7,8,9]];
    
</script>
    
<grid id="abc" datasource="ds"/>
    
<script>
        alert(abc.id);
    
</script>
</html>

test.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl
="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="grid.xsl"/>
<xsl:template match="/">
  
<html>
  
<head>
  
</head>
  
<body>
      
<xsl:apply-templates/>
  
</body>
  
</html>
</xsl:template>
<xsl:template match="//script">
    
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>

 grid.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl
="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//grid">
    
<h2>Grid</h2>
    
<script type="text/javascript">
        
<xsl:attribute name="id">
            
<xsl:value-of select="@id"/>
        
</xsl:attribute>
        if (Grid === undefined){
        var Grid = function (datasource){
            var tbl = document.createElement('table');
            tbl.border = 1;
            for (var i=0; i
&lt;datasource.length; i++){
                var tr = document.createElement('tr');
                for (var k=0; k
&lt;datasource[i].length; k++){
                    var td = document.createElement('td');
                    var tt = document.createTextNode(datasource[i][k]);
                    td.appendChild(tt);
                    tr.appendChild(td);
                }
                tbl.appendChild(tr);
            }
            return tbl;
        }
        }
        var 
<xsl:value-of select="@id"/> = function (){
            var sc = document.getElementById('
<xsl:value-of select="@id"/>');
            var gd = new Grid(
<xsl:value-of select="@datasource"/>);
            gd.id = "
<xsl:value-of select="@id"/>";
            sc.parentNode.replaceChild(gd, sc);
            return gd;
        }();
    
</script>
</xsl:template>
</xsl:stylesheet>

posted @ 2008-08-15 17:27 文宇祥 阅读(87) 评论(0) 编辑

2008年8月7日 #

private constructor的模拟

(function (Package){
    
var _key = {};
    
var ClassA = function (key_){
        
if (_key !== key_) throw 'non-public constructor!';
    }
    Package.ClassA 
= ClassA;
})(window);

posted @ 2008-08-07 09:56 文宇祥 阅读(61) 评论(0) 编辑

2008年8月4日 #

利用apply来进行参数传递和转换

function t(){
    
var fns = Array.prototype.concat.apply([], arguments);
    
for (var i = 0; i < fns.length; i++) {
        alert(fns[i]);
    }
}
t([
1,2,3],[1,2],1,1);

posted @ 2008-08-04 10:46 文宇祥 阅读(68) 评论(0) 编辑

2008年8月1日 #

代理constructor,prototype且不让instanceof失效

posted @ 2008-08-01 01:34 文宇祥 阅读(80) 评论(0) 编辑

2008年7月31日 #

javascript实现StrExp

posted @ 2008-07-31 15:44 文宇祥 阅读(378) 评论(0) 编辑

2008年7月28日 #

javascript: LoadModule, LoadModules

posted @ 2008-07-28 22:43 文宇祥 阅读(76) 评论(0) 编辑

2008年7月27日 #

javascript实现yield

posted @ 2008-07-27 16:12 文宇祥 阅读(1732) 评论(7) 编辑

2008年7月24日 #

判断函数调用是否来自new操作符.

posted @ 2008-07-24 10:42 文宇祥 阅读(53) 评论(0) 编辑

My Links

Blog Stats

News

搜索

 
 

常用链接

随笔分类

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

推荐排行榜