面向对象及闭包

封装
var Book = function(id,bookname,price){
this.id=id;
this.bookname=bookname;
this.price=price;
}
Book.prototype = {
display:function(){
console.log(this.bookname)
}
}
var book=new Book(1,'javascript',10)
console.log(book.id)
book.display();


通过this添加的属性和通过prototype添加的属性区别:


this
是给当前对象添加的
是当前对象自己拥有的
this定义的属性和方法在每次创建对象的时候都会创建


JavaScript是基于原型prototype的语言。每创建一个对象它都有一个原型prototype用于指向它继承的属性和方法。


通过prototype添加的属性和方法并不是对象自身的
需要通过原型一级一级查找得到
每次创建新对象的时候属性和方法不会再次创建


constructuor 又值什么呢:
它首先是一个属性 它的指向是整个原型的函数或对象
js在创建一个函数或则对象的时候默认会创建一个原型对象prototype
在prototype对象中又会创建一个constructor属性
在上面的例子中constructor这个指向的就是Book类


属性和方法的封装
var yourObject = (function() {
 
  // 私有属性和方法
 
return {
  // 公有方法和属性
}


})();


var Book = function(id,name,price){
// 私有属性
var _total = price;
// 私有方法
function _buyFood() {
  _total--;
}


// 特权方法
this.buy = function() {
   _buyFood();
}


this.getTotal = function() {
   return _total;
}
}


Book.prototype = {
// 公有属性
isJsBook:false,
// 公有方法
display:function(){}
}


// 类静态公有属性 无法用实例化的对象访问 需要使用Book.isChinese
Book.isChinese = true;
// 类静态共有方法 无法用实例化的对象访问 需要使用Book.resetTime
Book.resetTime = function(){
console.log('new time')
}




总结:
特权方法是指有权访问内部私有属性和私有方法的公有方法,而私有方法是指外部不可见且不可访问的方法。


在类中通过var 关键字定义的属性就是类的私有属性
通过function关键字加方法名定义的函数就是类的私有函数


通过this.方法名定义的方法就是特权方法或对象的公有方法
通过this.属性名定义的属性就是公有属性






闭包:
当function里嵌套function时,内部的function可以访问外部function里的变量
return的是内部function时,就是一个闭包
function foo(x) {
    var tmp = 3;
    return function (y) {
        alert(x + y + (++tmp));
    }
}
var bar = foo(2); // bar 现在是一个闭包
bar(10);


// Book 利用闭包实现 
// 在闭包内部实现一个完整的类将其返回
var Book = (function(){
// 静态私有变量
var bookNum=0;
// 静态私有方法
function _book(newId,newName,newPrice){
// 安全模式
if(this instanceof _book){
this.setId(newId);
this.setName(newName);
this.setPrice(newPrice);
}else{
return new _book(newId,newName,newPrice);
}
// 私有变量
var id,name,price;
// 私有方法
function checkID(id){};
// 特权方法
this.setName = function(){};
this.getName = function(){};
this.setId = function(id){
checkId(id)
};
this.getId = function(){


}
this.setPrice = function(){};
this.getPrice = function(){};
// 公有属性
this.id = newId;
// 公有方法
this.copy = function(){};
bookNum++;
if(bookNum>100)
throw new Error('只是卖100本哦');
// 构造器
this.setName(name);
this.setPrice(price);
}
// 构建原型
_book.prototype = {
// 静态公有属性
isJSBook:false,
// 静态公有方法
display:function(){}
}
// 返回类
return _book;
})();


### 类的安全模式访问
var Book = function(title,time,type){
if(this instanceof Book){
this.title = title;
this.time = time;
this.type = type;
}else{
return new Book(title,time,type);
}
}
// 这两种访问方式都可以
var book = Book('javascript','2018',js);
var book = new Book('javascript','2018',js);
原创文章 5 获赞 6 访问量 1353

猜你喜欢

转载自blog.csdn.net/qq_42072086/article/details/80090830