/**
* js原型 prototype,js使用原型实现类似继承
*/
//函数 = 【function XX(){函数体}】
//对象实例 = 【var obj =new XX()】
//对象[constructor]指向函数
//函数[prototype]指向原型对象
function MyObj(id){
this.id = id;
}
//重写toString
MyObj.prototype.toString = function(){
return "MyObj"+this.id;
};
function MyObj2(id){
this.id = id;
}
//重写toString
MyObj2.prototype.toString = function(){
return "MyObj2"+this.id;
};
var obj1 = new MyObj(1);
//alert(MyObj.constructor); //本地代码,无意义
//alert(obj1.prototype); //undefined
//alert("MyObj[prototype]改变前 obj1:"+obj1);
//alert("MyObj[prototype]改变前 MyObj.prototype:"+MyObj.prototype); //
//alert("MyObj[prototype]改变前 obj1.constructo:"+obj1.constructor); //构造函数
//alert("MyObj[prototype]改变前 obj1 instanceof:"+(obj1 instanceof MyObj2.prototype.constructor));
//重新指定原型对象
MyObj.prototype = new MyObj2(8);
//把原型对象的构造函数指回本身(否则是原型函数MyObj2)
//MyObj.prototype.constructor = MyObj;
MyObj.prototype.test = function(id){
return this.id === id;
};
obj1 = new MyObj(2);
//alert("MyObj[prototype]改变后 obj1:"+obj1);
//alert("MyObj[prototype]改变后 MyObj.prototype:"+MyObj.prototype); //原型对象
//alert("MyObj[prototype]改变后 obj1.constructor:"+obj1.constructor); //构造函数
alert("MyObj[prototype]改变后 obj1 instanceof:"+(obj1 instanceof MyObj2.prototype.constructor));
//alert("MyObj[prototype]改变后 obj1.test:"+obj1.test(2));
function Gizmo(id){
this.id = id;
this.ask = function(){
alert("gizmo**ask:"+this.id);
};
function privateMethod(){
return "gizmo**privateMethod";
};
privateMethod2 =function(){
return
"gizmo**privateMethod2";
};
}
Gizmo.prototype.toString = function(){
return "gizmo**toString:"+this.id;
};
Gizmo.prototype.id="gizmo3";
function Hoozit(id){
this.id = id;
}
Hoozit.prototype = new Gizmo("gizmo1");
var g = new Gizmo("gizmo2");
var h = new Hoozit("hoozit1");
h.ask = function(){
alert("h.ask:"+this.id);
};
h.ask();
delete h.ask;
h.ask();
delete h.id;
h.ask();
delete Hoozit.prototype.id;
h.ask();
//属性和方法的调用顺序:
//1、先在对象实例中找对应的方法,第一个ask()说明,调用h自己的ask()和属性"hoozit1"
//2、如实例上未找到,则在原型对象里找方法,第二个ask()说明,h.ask方法删除后,
// 在原型对象中找到ask方法,属性依然是自己的"hoozit1"。
// 第三个ask()说明,h.id属性删除后,在原型对象中找到id属性"gizmo1"
//3、如原型上也未找到,则回归原型链,在父原型链中递归找直到Object对象。第四个ask()说明,
// Hoozit.prototype.id原型id属性删除后,找到了原型的原型对象的id属性"gizmo3"
Gizmo.prototype.question = function(){
return "gizmo**question:"+this.id;
};
h.question.call(g);
alert(h.question.call(g));
h.question.apply(g);
alert(h.question.apply(g));
//利用apply和call方法把要调用的方法绑定到其他实例(设置上下文this对象),以上说明this.id是g对象的id
//alert(h.privateMethod());
//alert(h.privateMethod2());
//ERROR,任何在函数内部显示命名或匿名不加this.修饰的属性或方法,不能被外界访问。