关于继承和原型链

继承

继承是父对象的成员,子对象不用重复创建,也可以直接使用 这样就可以节约内存,代码重用。那我们什么时候使用继承呢?只要一类子对象,都需要相同的苏醒或功能时,只要将相同的属性和功能仅在父对象中定义一次即可。那我们怎么使用呢, js中的继承都是继承原型对象。原型对象又是什么呢?它是专门集中存储一类子对象相同属性和功能的父对象 同一类子对象所共有的属性或方法。那我们怎么定义?在我们创建构造函数的时候,构造函数会自动赠送一个原型对象。如何在原型对象中添加属性呢?例子如下:Student.prototype.className = ‘大一三班’;。关于原型对象中的方法和属性的访问 ,他其实和构造函数的方法是一样使用的。我们是怎么在两种类型中继承的呢?第一步:定义父类型;第二步:让子类型原型对象继承父类型原型对象;第三步:在子类构造函数中借用父类型构造函数(达到请父类型构造函数帮忙初始化属性结构)。这里有我自己做的一个例子:
有狮子、斑马、鲨鱼、海豚四类动物,他们都有年龄、体重这些信息,并且繁殖后代的方式都是胎生,但是生活方式却有所不同,狮子和斑马在陆地上生活,属于陆生动物,并且他们的扑食方式又不同,狮子靠捕捉其他小动物为生,而斑马靠食草为生,鲨鱼和海豚在水下生活,属于水生动物。请在确保代码的扩展性和较少冗余的情况下构造函数和原型
function Animal(name,age,height,breed){
this.name = name;
this.age = age;
this.height = height;
this.breed = breed;
}
Animal.prototype.lifeStyle = function(){
console.log(${this.name}在陆地上生活,属于陆生动物);
}
Animal.prototype.modeofLife = function(){
console.log(${this.name}在水下生活,属于水生动物);
}
function Lion(name,age,height,breed){
Animal.call(this,name,age,height,breed);
this.predation = function(){
console.log(${this.name}靠捕捉其他小动物为生)
}
}
Object.setPrototypeOf(Lion.prototype,Animal.prototype);
function Zebra(name,age,height,breed){
Animal.call(this,name,age,height,breed);
this.prayOn = function(){
console.log(${this.name}靠食草为生)
}
}
Object.setPrototypeOf(Zebra.prototype,Animal.prototype);
function Shark(name,age,height,breed){
Animal.call(this,name,age,height,breed);
}
Object.setPrototypeOf(Shark.prototype,Animal.prototype);
function Dolphin(name,age,height,breed){
Animal.call(this,name,age,height,breed);
}
Object.setPrototypeOf(Dolphin.prototype,Animal.prototype);

var shizi = new Lion("狮子",3,100,"胎生");
shizi.lifeStyle();
shizi.predation();
var banma = new Zebra("斑马",3,100,"胎生");
banma.lifeStyle();
banma.prayOn();
var shayu = new Shark("鲨鱼",3,100,"胎生");
shayu.modeofLife();
var haitun = new Dolphin("海豚",3,100,"胎生");
haitun.modeofLife();

原型链

首先因为原型本身也是个对象,因此原型对象也有原型,而原型链是由多级父元素逐级继承形成的链式结构。那么还有作用域链,这两个的区别是:原型链保存着所有对象的成员,而作用域链保存所有的变量。原型链的作用是控制对象访问成员的使用顺序:优先使用自己的,自己没有,才延原型链向父级查找。而作用域链的作用是控制变量的使用顺序:优先使用活动对象(AO)中的局部变量,局部中没有,才去延用作用域链向父级作用域查找。原型链的最顶端是Object.prototype。而作用域链的最顶端是window。那么我们简单的来概括这两个的区别,就是所有不需要"对象."访问的变量都保存在作用域链中,而所有需要用"对象."访问的变量都保存在原型链中。 最后,我们是怎么验证原型对象的呢,我这里有一个例子:
Object.getPrototypeOf(obj) == Array.prototype;
console.log(
Object.getPrototypeOf(obj1) == Array.prototype,
Object.getPrototypeOf(obj2) == Array.prototype

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章