var t = (function(){
function _(){
//即是构造函数 也相当于主程序 即程序入口
// t.e();//或者_.e();
}
//类(或者说构造函数)的默认原型是new Object(); --一个几乎没有属性的空对象(有constructor这个对象属性)
// 这里没有指明要继承的类 所以这里相当于在自己原型对象的object对象上面添加方法
_.prototype.eating = function (){
console.log('吃');
}
//相当于内部类
var A = (function(){
function a(){
}
a.prototype.he = function(){
console.log("喝");
}
return a;
})();
_.prototype.d = function(){
var d1 = new t.c();
d1.wan();
}
//静态方法
_.e = function(){
console.log("静态方法");
}
//相当于静态类
_.c = (function(){
function _(){};
//改变原型引用 ---也就把A里面的方法继承过来 如果不写这个那么他的原型直接指向object这个几乎为空的对象
// (Object的原型对象上才有我们常见的那些方法)
_.prototype = new A();
//这里相当于在原型对象A上添加方法
_.prototype.wan = function(){
console.log("玩");
}
return _;
})();
return _;
})();
var tt = new t();
var t1 = (function(){
function $(){};
$.prototype = tt;
return $;
})();
var tt1 = new t1();
// console.log(tt1);
// tt1.eating();
//
//因为在js里面静态方法和静态类 只能通过类名(构造函数名.静态方法()直接运行 不能用实例化对象运行 所以试图通过构造函数获取类名 来测试)
// tt1.e();// tt1.e is not a function直接调用会报错
//因为tt1的原型对象我们已经指定为了t1 ,而t1是我们自己编写的 并没有声明tt1的构造函数 , 所以tt1相当于(应该就是)没有构造函数 ,
//实例的构造函数名正常来说都在原型对象里面用constructor声明,没有声明的话 找到的其实不是本身的
// 所以他继续往上找, 找到的其实是t1的构造函数
tt1.constructor.e();//成功
console.log(tt1.constructor.name === tt1.__proto__.constructor);//true
//正常来说 如果直接new 构造函数()创建一个对象的话 他的构造函数名称在他的原型对象里保存||这个原型对象是个空对象new Object()--->
// function Object(){this.constructor={......};} ---然后Object的原型对象里面存储了我们平常用的公共方法(例如toString()), object原型对象的原型对象是null
//而一个构造函数的原型指明是另一个对象的话, 最好在原型对象里面指明他的构造函数 ,不然他相当于没有构造函数,找到的是父类的构造函数