--参看文献;
--http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html
比如,现在有一个"动物"对象的构造函数。
function Animal(){this.species = "动物";
}
还有一个"猫"对象的构造函数。
function Cat(name,color){this.name = name;
this.color = color;
}
怎样才能使"猫"继承"动物"呢?
一:构造函数绑定;
使用 call 或者 apply方法;将父对象的构造函数绑定在子对象上;
子对象构造函数中加一行:
function Cat(name,color){
Animal.apply(this, arguments);
this.name = name;
this.color = color;
}
var cat1 = new Cat("大毛","黄色");
alert(cat1.species); // 动物
二、 prototype模式
如果猫的prototype对象,指向一个animal实例,那么所有猫的实例,就能继承animal 了;
Cat.prototype=new Animal();
Cat.prototype.constructor=Cat;
var c=new Cat("小猫",“黑色”)
alert(c.species)
注意,解析:
cat 的prototype 对象指向了一个animal实例;它相当于完全删除了原先的值;然后赋值给一个新的值
原来任何一个prototype对象都有一个constructor属性,指向它的构造函数;
有"Cat.prototype = new Animal();"这一行,Cat.prototype.constructor是指向Cat的;加了这一行以后,Cat.prototype.constructor指向 Animal。
更重要的是,每一个实例也有一个constructor属性,默认调用prototype对象的constructor属性。
这显然会导致继承链的紊乱
这是很重要的一点,编程时务必要遵守。下文都遵循这一点,即如果替换了prototype对象,
o.prototype = {};
那么,下一步必然是为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数。
o.prototype.constructor = o;
三、 直接继承prototype
四、 利用空对象作为中介
五、 拷贝继承
//继续 我们的继承方面的知识;
function public(){ } public.prototype.publicAction="eat fuck sleep"; public.prototype.publicTag="people"; function student(name,age,grade){ this.name=name; this.age=age; this.grade=grade; } //继承机制; //prototype 实现继承; //avascript规定,每一个构造函数都有一个prototype //属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承 function extend(Child,Parent){ var F=function (){}; F.prototype=Parent.prototype; Child.prototype=new F(); Child.prototype.constructor=Child; } //使用拷贝继承; function extend2(Child,Parent){ var p=Parent.prototype; var c=Child.prototype; for(var i in p){ c[i]=p[i]; } } function test(){ extend2(student,public); var stu=new student("jack",18,99); alert(stu.name); alert(stu.publicAction); } //一些常用的属性和方法; //isPrototypeOf(); //判断某个prototype对象和某个实例之间的关系; //个方法用来判断,某个proptotype对象和某个实例之间的关系。 function show0(){ var stu=new student("jack",18,90); alert(student.isPrototypeOf(stu));// false var p=new public(); alert(public.prototype.isPrototypeOf(p)); //true } //hasOwnProperty() //每个实例都有一个hasOwnPrototype():用来判断属性是属于本地还继承的呀; function show8(){ var stu=new student("jack",19,99); alert(stu.hasOwnProperty("publicAction")); alert(stu.hasOwnProperty("name")); } //in 运算符号 用来判断,某个实例是否含有某个属性,不管值本地还是继承的; function show12(){ var stu=new student("jack",19,90); alert("name" in stu) alert("xx" in stu) } //还可以用来遍历某个对象的所有属性的呀; function show11(){ var stu=new student("jack",12,12); for(var x in stu){ alert(x); //本地属性; } } function show(){ // var stu=new student("jack",12,12); var p=public.prototype; for(var i in p){ //本地属性; alert(i); //指着输出的是字段 alert(p[i]);//这个输出的字段的内容 } }