关于js的强类型检查的思考

来源:互联网 发布:go语言编程 编辑:程序博客网 时间:2024/06/09 17:53
 将java、c和js做个比较:
java、c在编译期(build)将类定义编译(翻译)成为虚方法表(VMT),VMT在运行期“不可修改”。
传统的js虚拟机,由于js是原型链,估计只是在虚拟机本身对基类有VMT,基类之上估计是虚拟机把prototype的hash“看做”VMT进行处理;v8好像有些不一样,没深入研究。
换句话说,就是:
java、c是运行期“不可修改”。当然,可以通过修改内存指针来修改或做切片,但这不是java、c语言规范本身所定义/支持的,而是编程手段,属于另一个范畴。
js是运行期可修改的,即prototype可以自由定义、修改,是js语言本身所支持的。
基于上述观点,那么:
1、js的强类型检查,可以通过检查prototype来实现,可以不用去做预编译,这会简化很多。
2、通过prototype做检查,可以避免几个难点,即使运行期修改了prototype也可以正确检查判断。即使按我说的js是数据(即运行期可改变),只要是修改prototype,即定义,而不是实例,还是可以正确判断。
3、多继承,如果采用类似dojo的C3算法,同样可以正确判断。
dojo中,部分实现了该想法,即 isInstanceOf()。

 还是有点问题,比如:
1、function调用时的参数怎么判断,这个没想好。
2、一个例子:
var A<-Object = {///A<-Object表示A继承自Object,即A.prototype = Object
    prop1<-Number: 1,
    prop2<-String: "str",
    prop3: "s",///缺<-时,采用值的prototype,即String
    prop4: function(){}///function不能继承,但是能否扩展,待考虑
};
var a = new A(), a1= new A(prop5: 5);
则:
a<-A 为 true
a1<-A 为 true
a1<-a 为 false
a == a1 为false
如果在运行期动态地:
A.prop5 = 5;
那么:
a == a1 为 true
a === a1 为 true
这时有个问题:
a.prop5 是否等于 a1.prop5?
即,a.proto5 的this是A,而a1.proto5的this是a1
如果在设计期就 A.prop5: 5,那么a.prop5和a1.prop5的this都是A。

 补充一下关于vmt和闭包,及this:
对于java、c,this就是VMT的入口地址(入口指针),
对于js,this是闭包的入口地址
换句话说,其实js的闭包可以看做是一个vmt

在java、c中,一般我们是不会(不允许)去改变this的,除非特别地通过内存操作去修改和做切片,所以,java也可以说是特殊的编译语言
而 js,this是可以随意修改的,即闭包在没有绑定的时候,this是未定义的,无意义的,但是绑定后,this指向调用者,而这个调用者,却并不是编译语言中在设计期就确定了的。
这也就是我一直说的,js是数据,而不是代码。


0 0
原创粉丝点击