JS定义类和属性,封装继承和多态,保护属性,私有属性,作业,friendly【诗书画唱】
目录(下面的词条是按顺序的,想看一个词条的结尾,就CTRL+F下一个词条):
(第1,2,3题)创建一个Person类,包含name公开的属性,age受保护的属性,这个值只能是数字,私有的属性account。
创建一个showMoney私有的方法,在这个方法中打印出account的值。
创建一个showMsg公开的方法,在这个方法中打印出name和age,并且调用showMoney方法。
我写的题目答案:第1,2,3题.html
(第4题)创建一个交通类Trafic和它的两个子类Car和Bike,通过多态实现每种交通工具的run方法。
我写的题目答案:第4题(代码多的方法).html
我写的题目答案:第4题(代码少的方法).html
个人笔记
friendly
实例代码
定义类和属性.html
多态.html
封装继承和多态.html
注释:
同色的“
个人笔记
friendly”
表示“friendly”词条在“个人笔记”词条里面

(第1,2,3题)创建一个Person类,包含name公开的属性,age受保护的属性,这个值只能是数字,私有的属性account。
创建一个showMoney私有的方法,在这个方法中打印出account的值。
创建一个showMsg公开的方法,在这个方法中打印出name和age,并且调用showMoney方法。
我写的题目答案:第1,2,3题.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
//创建Person类
var Person = function(name,age,account){
//定义一个公有的属性:
this.name = name;
//定义一个公有的方法:
this.showMsg= function(){
//打印出name和age,并且调用showMoney方法:
console.log('name:'+name+",age:"+age);
showMoney();
}
//定义一个受保护的属性age :
Object.defineProperty(this,'age',{
get: function(){
console.log('调用了get方法');
return 'age的值是:' + age;
},
set: function(val){
console.log('调用了set方法');
//用if判断限制这个值只能是数字:
if(!isNaN(val)) {
age = val;
}
}
});
//定义了一个私有的属性account:
//私有的属性在类的外部是无法访问的:
var _account= account;
//私有方法在类的外部是无法访问的:
var showMoney= function(){
console.log(_account);
}
//在类的内部调用私有方法:
showMoney();
}
var p= new Person('诗书画唱',9,999.9);
//调用set方法(使用"点"和"赋值")(这里的set方法可以不调用,要修改age值时才调用):
p.age = 9;
//调用get方法(使用"控制台打印"和"点"):
console.log(p.age);
//私有的属性在类的外部是无法访问的,所以这里控制台打印的结果是undefined:
console.log(p.account);
//在类外部调用公有方法:
p.showMsg();
</script>
<body>
</body>
</html>


(第4题)创建一个交通类Trafic和它的两个子类Car和Bike,通过多态实现每种交通工具的run方法。
我写的题目答案:第4题(代码多的方法).html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
//封装:
Object.copy = function(des,src){
for(var attr in src) {
des[attr] = src[attr];
}
return des;
};
Object.prototype.extend = function(o){
return Object.copy(this,o);
}
//定义父类:
var Trafic = function(){};
Trafic.prototype = {
go: function(){
this.run();
},
run: function(){}
};
//定义子类继承父类:
//Car继承Trafic:
var Car = function(){};
var fuLei = new Trafic();
var duoTaiFangFa = {
run: function(){
console.log('Car中调用run方法');
}
};
Car.prototype = fuLei.extend(duoTaiFangFa);
//多态调用方法:
var r = new Car();
r.go();
//Bike继承Trafic:
var Bike= function(){};
var fuLei = new Trafic();
var duoTaiFangFa= {
run: function(){
console.log('Bike中调用run方法');
}
};
Bike.prototype = fuLei.extend(duoTaiFangFa);
//多态调用方法:
var r = new Bike();
r.go();
</script>
<body>
</body>
</html>


我写的题目答案:第4题(代码少的方法).html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<script>
//父类:
var Trafic = function(type){
type.run();
}
//子类:
var Car = function(){};
Car.prototype.run = function(){
console.log('Car中调用run方法');
}
//调用:
Trafic(new Car());
//子类:
var Bike = function(){};
Bike.prototype.run = function(){
console.log('Bike中调用run方法');
}
//调用:
Trafic(new Bike());
</script>
<body>
</body>
</html>


个人笔记



访问权限修饰符权限从高到低排列是public ,protected ,friendly, private。















实例代码
定义类和属性.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
//创建了一个Animal类
var Animal = function(name,type,color){
//定义了一个private _type
//_type在Animal类的外部是无法访问的
var _type = type;
//私有的方法
//isAnimal方法在Animal类的外部是无法访问的
var isAnimal = function(){
console.log(_type === 'animal');
}
isAnimal();
//定义一个受保护的属性name
Object.defineProperty(this,'name',{
get: function(){
//在这里可以写一段判断逻辑,来保护name属性不会被随便获取到
console.log('调用了get方法');
return '动物的名字是:' + name;
},
set: function(val){
console.log('调用了set方法');
if(val) {
name = val;
}
}
});
//定义一个公有的属性和方法
this.color = color;
this.eat = function(){
console.log('正在吃东西');
}
this.age = 5;
}
Animal.prototype.age = 2;
Animal.prototype.play = function(){
console.log('正在玩耍');
}
//定义Animal类的静态的属性和方法
Animal.total = 47;
Animal.count = function(){
return Animal.total;
}
//创建一个Animal对象
var cat = new Animal('大黄','猫','黄色');
cat.name = '花花';
console.log(cat.name);
console.log(cat.color);
cat.eat();
console.log(cat.age);
cat.play();
console.log(Animal.total);
console.log(Animal.count());
</script>
</head>
<body>
</body>
</html>


多态.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
var shape = function(type){
type.draw();
}
var Rect = function(){};
Rect.prototype.draw = function(){
console.log('矩形');
}
shape(new Rect());
var Circle = function(){};
Circle.prototype.draw = function(){
console.log('圆形');
}
shape(new Circle());
</script>
</head>
<body>
</body>
</html>


封装继承和多态.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script>
//给Object类定义了一个静态的方法
//将src对象中的属性和方法复制到des对象中去
Object.copy = function(des,src){
for(var attr in src) {
des[attr] = src[attr];
}
return des;
};
var father = {
money: 200000,
house: 1,
work: function(){
console.log('正在工作');
}
};
var son = {
name: '小明'
}
// var s = Object.copy(son,father);
// console.log(s);
Object.prototype.extend = function(o){
return Object.copy(this,o);
}
var s = son.extend(father);
//console.log(s);
var Shape = function(){};
Shape.prototype = {
draw: function(){
//通过调用_d空方法来实现多态
this._d();
},
_d: function(){}
};
//定义了一个矩形类继承Shape
var Rect = function(){};
var sp = new Shape();
var f = {
_d: function(){
console.log('绘制一个矩形');
}
};
Rect.prototype = sp.extend(f);
//多态调用draw方法
var r = new Rect();
r.draw();
// var Circle = function(){};
// Circle.prototype = sp.extend({
// _d: function(){
// console.log('绘制一个圆形');
// }
// });
// var c = new Circle();
// c.draw();
</script>
</head>
<body>
</body>
</html>

