日期:2014-05-16  浏览次数:20349 次

js 的类中类 设计方式是否有问题?
js 的类中类的设计方式是否有问题?
  为什么不见大家这样写js ?
有什么优点与缺点?

方法一:
JScript code
var parentClass = function(){
    //类中的属性:
    this.value="parent";
    //类中类:
    this.sonClass = function(){
        this.value = "son";
    };
};
var parent = new parentClass();
var son = new parent.sonClass();
alert(son.value);
alert(parent.value);
//结果: son   后 parent

方法二:
JScript code
///========================================
var parentClass = function(){
    //类中的属性:
    this.value="parent";
    //类中类:
    this.sonClass = function(){
        this.value = "son";
    };
    this.sonObj;
    //构造func
    (function(){
        this.sonObj=new this.sonClass();
    }).apply(this,arguments);
};
var parent = new parentClass();
alert(parent.sonObj.value);
alert(parent.value);
//结果: son   后 parent


------解决方案--------------------
第一种,可读性上就差,this.sonClass这种方式很容易被误认为是一个方法。还有就是sonClass如果外面用不到,也不用暴露出来了,直接和parentClass内部即可。
JScript code

var parentClass = function(){
    //类中的属性:
    this.value="parent";
    //类中类:
    var sonClass = function(){
        this.value = "son";
    };
};
var parent = new parentClass();

------解决方案--------------------
搞不清楚你这么设计的目标是什么,sonClass继承parentClass?
------解决方案--------------------
无所谓什么类中类,js中的函数(方法)都可以当作构造函数使用,就比如随便写个
function test(){}
var a=new test();//一样可以产生一个对象,只是没有属性而已;
a.test=test;
var b=new a.test();//方法也可以当作构造函数使用,当然也没有属性

像你上面那个所谓类中类,当作方法调用一样是可以的
var parent = new parentClass();
parent.sonClass();//方法里面的this指代方法拥有者,所以这个方法在这里给parent对象添加了一个value属性
alert(parent.value);
------解决方案--------------------
用namespace啊
JScript code

var ns1 = ns1 || {};
ns1.foo = function(){};
var ns2 = ns2 || {};
ns2.foo = function(){};

------解决方案--------------------
JScript code
var parentClass={
    //类中的属性:
    value:"parent",
    //类中类:
    sonClass:{
        value:"son"
    }
};
alert(parentClass.value);
alert(parentClass.sonClass.value);