面向对象是几乎所有程序员要掌握的一种思想,也是在开发中有着非常重要的应用,我们常用的编程语言比如Java,C++,C#,PhP,Python等都可以使用面向对象开发出非常强健的代码,几乎所有面向对象的语言都具备三大特性。分别是:封装、继承和多态。在JavaScript中这三种特性仍然非常重要,使用封装,继承,多态的方式可以开发出非常强健的JS代码,提升项目的性能。
我们首先来了解一下封装的相关思想。
1.1. 创建一个类
在JavaScript中创建一个类非常简单,给一个函数取名后赋值给一个变量。初始化后,所有this都会自动指向新创建的实例。
var Product = function(id,name,costPrice){
this.id = id;
this.name=name;
this.costPrice=costPrice;
}
除此之外,我们也可以使用原型方式来定义类的特性:
// 一次设置一个
Product.prototype.getName=function(){
.....
}
// 或者一次设置多个
Product.prototype={
getId:function(){
....
},
getName:function(){
....
},
constructor:Product // 还原构造器
}
定义好类之后,使用new关键字创建实例。有个最大问题是所有属性都对外公开,也就是我们的成本价,对外是透明的。
var product = new Product(1,’手机’,200);
alert(product.costPrice); // 成本价200
1.2. 看看封装怎么做
JavaScript提供有以下几种控制方法和属性的权限:
1. 公开级别:对外公开
2. 私有级别:类内部可以访问,对外不公开
var Product = function(id,name,costPrice){
// 公有属性
this.name=name;
// 私有属性
var _id = id;
var _costPrice=costPrice;
// 公有方法
this.show=function(){
alert(‘2019年新品:’+this.name+’,价格公道,只要:’+calculatorSalePrice());
}
// 私有方法
function calculatorSalePrice(){
return costPrice*4.5; // 一般手机利润是400%左右
}
// 特权方法(getter&setter)
this.setId=function(id){
_id = id;
}
this.getId=function(){
return _id;
}
this.setCostPrice=function(costPrice){
_costPrice = costPrice;
}
// 构造器
this.setName(name);
this.setCostPrice(costPrice);
}
我们对类再添加点特殊的内容:
// 类静态公有属性
Product.madeInChina = false;
// 类静态公有方法
Product.SALE =function(){
console.debug(‘打折了,打折了,买不了吃亏,买不了上当’);
}
// 类原型公有定义
Product.prototype ={
// 公有属性
isCellphone : true,
// 公有方法
toString : function(){
}
}
做一个输出:
var p = new Product(5, ’华为P30’, 1200);
console.debug(p.name); // 华为P30
console.debug(p._costPrice); // undeined
console.debug(p.show()); // 2019年新品华为P30,价格公道,只要:5400’
console.debug(p.madeInChina ); // undeined
console.debug(p.isCellphone ); // true
从上面可以看出,对象实例访问不了静态公有属性,但是我们可以这样访问:
console.debug(Product.madeInChina); //false
Product.SALE(); //打折了,打折了,买不了吃亏,买不了上当
其实静态方法在系统的类中有非常多的应用,比如大家可以了解String字符串类,有没有类似的静态方法呢,静态方法的作用是什么??
利用闭包来完成封装,也是在实战应用中经常的开发技术,关于闭包的相关概念和应用,我们在后面的文章中继续给大家分享。
如果您有其他的见解,欢迎在评论区留言,谢谢!