代码改变世界

继承

2019-08-10 17:15  张海峰999  阅读(128)  评论(0编辑  收藏  举报
继承:父对象的成员,子对象不用重复创建,也可以直接使用 这样就可以节约内存,代码重用
原型对象:专门集中存储一类子对象相同属性和功能的父对象 同一类子对象所共有的属性或方法
unction Student(sname,sage){

  this.name1 = sname;
  this.sage1 = sage;
}
//原型对象 prototype 是构造函数的一个属性
Student.prototype.intr = function (){

  console.log(`姓名${this.name1},年龄${this.sage1}`);
}
 
var li = new Student('li',20);
var wang = new Student('wang',21);
console.log(li);
// 在原型对象中添加属性
Student.prototype.classname = '大一';
console.log(li.classname);
console.log(wang.classname);
// 访问原型对象
li.intr();
wang.intr();
//修改原型对象中的属性或方法 不会改变原型对象中的属性值,而是在子对象中自己添加一个新的属性
li.classname = '大三';
console.log(li.classname,wang.classname);
 
 
自由属性和共有属性
创建的类型名.属性/方法名
赋值:
自有属性:对象名.属性 =值;
 共有属性:构造函数.prototype.属性名 = 值
 鉴别自有属性 var bool.hasOwnProperty("属性名")
 判断属性名是否是obj的自有属性
 true:为自有属性
 false:不是自有属性,共有属性,不存在的属性
 
自有属性
 var own = li.hasOwnProperty('name1');
 console.log(own);//true
 
 

function checkProperty(obj,pname){

  if(obj.hasOwnProperty(pname)){
    console.log('自有属性');

  }else if(pname in obj){//if(obj[pname] !== undefined)
    console.log('共有');
    // 检测panme中存储的属性名是否在obj对象中,
  }else{
    console.log('没有');
  }
}
checkProperty(li,"sage1");//自有
checkProperty(wang,"classname");//共有
checkProperty(li,"teacher");//没有
 
 
原型链
原型链本身也是对象,因此原型对象也有原型    对象就有_proto_,由多级父元素逐级继承形成的链式结构
原型链保存着:所有对象的成员(方法和属性)
原型链作用:控制对象访问成员的使用顺序:优先使用自己的,自己没有,才延原型链向父级查找
作用域链作用:控制变量的使用顺序(优先使用活动对象(AO)中的局部变量,局部中没有,才去延用作用域链向父级作用域查找)
原型链最顶端:Object.prototype
  作用域链的终点:window
 
// 定义父类型
function Car(speed, fee) {
this.speed = speed;
this.fee = fee;
}
Car.prototype.ride = function() {
console.log(`骑行的速度${this.speed},费用为${this.fee}`);
}

//让getbrand的原型对象继承Car的原型对象
Object.setPrototypeOf(Ofo.prototype, Car.prototype);

function Ofo(speed, fee, brand) {
// this.speed = speed;
// this.fee = fee;
Car.call(this, speed, fee); //父类型构造函数.call(this,参数...)
this.brand = brand;
}
Ofo.prototype.getbrand = function() {
console.log(`品牌为${this.brand}`);
}
var car1 = new Ofo(10, 2, 'ofo');
car1.getbrand();
car1.ride();

//让getcopy的原型对象继承Car的原型对象
Object.setPrototypeOf(Hello.prototype, Car.prototype);

function Hello(speed, fee, copy) {
// this.speed = speed;
// this.fee = fee;
Car.call(this, speed, fee); //父类型构造函数.call(this,参数...)
this.copy = copy;
}
Hello.prototype.getcopy = function() {
console.log(`品牌为${this.copy}`);
}
var car2 = new Hello(15, 1.5, 'Hello');
car2.getcopy();
car2.ride();