失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > JS-面向对象-继承

JS-面向对象-继承

时间:2021-01-20 01:39:26

相关推荐

JS-面向对象-继承

--参看文献;

--/blog//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]);//这个输出的字段的内容

}

}

如果觉得《JS-面向对象-继承》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。