面向对象的程序设计

对象的创建:(1)字面量创建:var o={a:10,b:20}
(2)构造函数创建:var o=new Object();
类的创建:(1)工厂模式
(2)构造函数模式
(3)原型模式
(4)混合模式:结合了构造函数模式和原型模式的优点。
(5)ES6创建类的方法。
变量的本质:
类的继承:
一、利用混合模式创建类

1、创建类的构造函数需要使用function来实现,类名的首字母习惯大写。
2、创建类就是创建类的属性和方法。
(1)类的属性书写在构造函数内部。
(2)类的方法书写在构造函数的原型上。
3、构造函数创建好之后,该构造函数的原型就自动出现了:类名.prototype

1、利用混合模式定义一个学生类。该类包括学号、姓名、性别、年龄四个属性;包括设置年龄加 1 岁的方法。
function Student(no,name,sex,age){
//书写Student类的属性,类的属性利用this声明
this.no=no;
this.name=name;
this.sex=sex;
this.age=age;
}
Student.prototype.addAge=function(){
this.age=this.age+1;
}

2、利用混合模式定义一个水果类。该类包括水果的名称、颜色、产地和单价四个属性;包括获取单价和改变单价的两个方法。

function Fruit(name,color,address,price){
this.name=name;
this.color=color;
this.address=address;
this.price=price;
}
Fruit.prototype.getPrice=function(){
return this.price;
}
Fruit.prototype.setPrice=function(newPrice){
this.price=newPrice;
}

总结:(1)创建类需要创建类的构造函数(构造函数名就是类名)。 (2)类的属性定义在构造函数中。 (3)类的方法定义在原型上(类名.prototype)。

(二)通过JavaScript内置类(Array)来实现混合模式
Array类的属性:length
Array类的方法:sort()、reverse()、slice()、splice()等。
在JavaScript内部Array类是如何实现的?利用混合模式实现的。
可能会有下列格式的代码出现在JavaScript的内核中:
function Array(length){
this.length=length;
}
Array.prototype.sort=function(){…}
Array.prototype.reverse=function(){…}
JavaScript内置类和自定义类都是利用混合模式的格式来创建的。

(三)构造函数如何执行
1、构造函数不能依靠函数名的调用来执行。
2、必须利用构造函数创建类的实例,在创建类的实例的同时会自动执行。
格式:var 实例名=new 类名(参数);
例:var arr=new Array(10);
3、例如创建一个空类(既没有属性也没有方法),只需要验证在创建类的实例的同时构造函数是否自动执行?
function Student(){
console.log(‘我被自动执行了’)
}
var s1=new Student();
(四)类的属性如何引用、类的方法如何调用
类的属性和方法必须使用实例来进行访问。

(五)类、构造函数、原型、实例之间的关系
1、构造函数就是类,构造函数名就是类名。
2、类、原型之间的关系:
(1)类具备一个名为prototype的属性,该属性指向类的原型。
(2)类的原型具备一个名为constructor的属性,该属性指向类本身。
结论:Student.prototype.constructor===Student //成立
3、实例、原型之间的关系:
(1)实例具备一个[[Prototype]]的隐藏属性(代码中不能直接调用),该属性指向类的
原型。
s1.[[Prototype]] //非法的
(2)验证隐藏属性[[Prototype]]的存在:
Student.prototype.isPrototypeOf(s1)
功能:判断原型和实例之间隐藏的[[Prototype]]属性是否存在。
返回true,表示原型和实例之间的[[Prototype]]属性是存在的;
返回false,表示原型和实例之间的[[Prototype]]属性是不存在的。
例:function Student(){}
var s1=new Student();
var s2=new Date();
console.log(Student.prototype.isPrototypeOf(s1));
console.log(Student.prototype.isPrototypeOf(s2));
(3)得到[[Prototype]]的值:
Object.getPrototypeOf(s1)
功能:得到这个隐藏的[[Prototype]]的取值。
Object.getPrototypeOf(s1)===Student.prototype
(4)实例的 _ proto 属性:指向原型。
Object.getPrototypeOf(s1)===s1.
proto _
s1._ proto _===Student.prototype

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值