封装
首先我们得先创建一个类,如何创建?首先声明一个函数保存在一个变量中,按编程习惯一般将这个变量名首字母大写。在这个函数得内部,用this添加属性或者方法。类也是一个对象,所以也有原型prototype,当然也可以在原型对象上赋值。
//创建一个Web类
var Web = function(id, name, address){
this.id = id;
this.name = name;
this.address = address;
}
//或者
var Web.prototype.display = function(){
//内部逻辑
}
这样我们就将属性和方法封装在我们抽象的Web类里面了,当使用功能方法时,我们不能直接使用这个Web类,需要用new关键字来实例化(创建)新对象。
var web = new Web(1,'我的CSDN','');
console.log(web.name) //我的CSDN
当然我们在封装内创建属性的方法不仅仅只有上面这两种。
私有属性(方法):由于JavaScript的函数级作用域,声明在函数内部的变量以及方法在外界时访问不到的。
对象公有属性:在函数内部通过this创建的属性,每个对象自身都拥有一份并且可以在外部访问到。
特权方法:在函数内部通过this创建的方法,不但可以访问这些对象的共有属性,还能访问到类或对象自身的私有属性和方法。
构造器:在对象创建时通过使用特权方法,我们可以初始化实力对象的一些属性,因此这些在创建对象时调用的特权方法还可以看作时类的构造器。
类的静态公有属性(方法):通过new关键字创建新对象时,由于类外面通过点语法添加的属性和方法没有执行到,所以新创建的对象无法获取它们。
公有属性(方法):类通过prototype创建的属性或方法在类实例的对象中是可以通过this访问到的。
//私有属性与私有方法,特权方法,对象公有属性,构造器,类的静态公有属性与方法,公有属性与方法
var Web = function(id, name, address){
//私有属性
var index = 1;
//私有方法
function checkIndex(){};
//特权方法
this.getName = function(){};
this.getAddress = function(){};
this.setName = function(){};
this.setAddress = function(){};
//对象公有属性
this.id = id;
//构造器
this.setName(name);
this.setAddress(address);
}
//类的静态公有属性(对象不能访问)
Web.language = 'China';
//类的静态公有方法(对象不能访问)
Web.updateTime = function(){
console.log('updateTime')
}
Web.prototype = {
//公有属性
isPublic : true,
//公有方法
display : function(){
console.log('display');
}
}
//测试代码
var web = new Web(2,'我的CSDN','');
console.log(web.index) //undefined
console.log(web.id) //2
console.log(web.language) //undefined
console.log(web.isPublic) //true
console.log(Web.language) //China
console.log(Web.updateTime()) //updateTime
闭包实现
有时我们经常将类的静态变量通过闭包来实现
//利用闭包实现
var Book = (function(){
//静态私有变量
var bookNum = 0;
//静态私有方法
function checkBook(){}
//创建类
function _book(newId, newName, newPrice){
//私有变量
var name, price;
//私有方法
function checkId(id){}
//特权方法
this.getName = function(){}
this.getPrice = function(){}
this.setName = function(){}
this.setPrice = function(){}
//公有属性
this.id = newId;
bookNum++
if(bookNum > 10){
throw new Error('我们仅出版100本书');
}
//构造器
this.setName(newName);
this.setPrice(newPrice);
}
//构建原型
_book.prototype = {
//静态公有属性
isJSBook : false,
//静态公有方法
display : function(){}
}
//返回类
return _book;
})()
闭包是有权访问另一个函数作用域中变量的函数,即在一个函数内部创建另外一个函数。我们将这个闭包作为创建对象的构造函数,这样它既是闭包又是可实例对象的函数,即可以访问到类函数作用域中的变量,如bookNum这个变量,此时这个变量叫静态私有变量,并且checkBook()可称之为静态私有方法。