javascript笔记(JavaScript_Core电子书)-原型

/**
 * 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.修饰的属性或方法,不能被外界访问。

你可能感兴趣的:(js原型)