JavaScript基础-对象、继承、传值/址基本知识实践

1、定义类
// 函数作为类
function Animal(name){
	this.name = name;
  this.type = "animal";
  this.say=function(){
    console.log("I'm a "+this.type+",my name is "+this.name);
  }
}
// 实例化Animal对象
var myDog = new Animal("liulang");
myDog.say();

javaScript是基于原型的语言,通过new实例化出来的对象,其属性和行为来自于两部分, 一部分来自于构造函数,另一部分来自于原型。 什么是原型呢?当我们声明一个类时,其实同时生成了一个对应的原型,例如我们定义了 Animal这个类时,会生成一个与Animal对应的原型,通过Animal.prototype可以指向这个原型, 原型可以通过constructor指向Animal类,更确切地说,是指向Animal类的构造函数。

// 使用原型重写Animal类

function Animal(){

}
Animal.prototype = {
  name:"xxx",
  type:"animal",
  say:function(){
   console.log("prototype log.I'm a "+this.type+",my name is "+this.name); 
 }
}

// 实例化Animal对象
var myDog = new Animal("liulang");
myDog.say();

原型就是一个hash对象,因此,还有另一种写法:

Animal.prototype.name="YYY";
Animal.prototype.type="animal";
Animal.prototype.say=function(){
  console.log("prototype log.I'm a "+this.type+",my name is "+this.name); 
};

// 实例化Animal对象
var myDog = new Animal("liulang");
myDog.say();

// 典型写法:把属性写在构造函数李,而不是放在原型里,方便从构造函数里接收参数。
function Animal(name){
  this.name = name;
  this.type = "animal";
}
Animal.prototype={
  say:function(){
    console.log("prototype log.I'm a "+this.type+",my name is "+this.name);   
  }
};

}
2.私有和共有

其他面向对象语言会提供private、public、protected等关键字来声明属性和行为的 可访问性是共有还是私有。但JavaScript不提供这类关键字,是通过作用域来实现的。

function Animal(name){
  this.name = name || "xxx";
  this.type = "animal";
  // 私有属性
  var age = 20;
  // 私有方法
  var move=function(){
    console.log("I'm moving");
  }
}
Animal.prototype={
  say:function(){
    console.log("prototype log.I'm a "+this.type+",my name is "+this.name);   
  }
};
3.继承

其他面向对象语言提供extend之类的方法用于处理类的继承,JavaScript没有, 使用继承需要用点技巧。

function Bird(name){
  //继承构造函数
  Animal.call(this,name);
}
//继承原型
Bird.prototype=Animal.prototype;
//新增行为
Bird.prototype.fly=function(){
  console.log("I'm flying");
}

 var bird = new Bird("bird");
 bird.say();
 bird.fly();
 var myDog = new Animal("liulang");
 myDog.fly();
4.传值和传址

疑问:为什么上面的例子中Animal类的实例也有fly()对象,在JavaScript中,赋值语句会用 传值和传址两种不同的方式进行赋值,如果说数字型、布尔型、字符串型,赋值就是 复制,如果是数组、hash对象等复杂数据结构会直接用内存地址赋值,而不是 将数据复制一份。prototype本质是一个hash对象,要避免这种情况,有两种方法:

  • 1、可以用for in 来遍历prototype对象来实现传值
  • 2、使用new function
function Bird(name){
  Animal.call(this,name);
}
Bird.prototype = new Animal();
Bird.prototype.constructor = Bird;
Bird.prototype.fly=function(){
  console.log("I'm flying");
}
var bird = new Bird("bird");
bird.say();
bird.fly();
var myDog = new Animal("liulang");
myDog.fly();//报错
参考来源
  • 《编写高质量代码-Web前端开发修炼之道》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值