学习JavaScript设计模式——面向对象(一)
2019-02-28 本文已影响0人
小霸王的铲屎官
面向对象(一)
1. 封装
创建类的方式
- 声明一个函数保存在一个变量里
- 在这个函数(类)的内部通过对this(函数内部自带的一个变量,用于指向当前这个对象)变量添加属性或者方法来实现对类添加属性或者方法
let Book = function(id, bookname, price){
this.id = id
this.bookname = bookname
this.price = price
}
- 也可以通过类的原型(类也是一个对象,所以也有原型prototype)上添加属性和方法
- 一种是一一为原型对象属性赋值
- 另一种是将一个对象赋值给类的原型对象
- 不要混用
Book.prototype.display = function(){
// 展示这本书
}
或
Book.prototype = {
display: function() {}
}
通过this添加的属性和方法同pototype中添加的属性和方法的区别?
-
通过this添加的属性、方法是在当前对象上添加的,这些属性和方法是该对象自身拥有的
-
prototype中添加继承的属性和方法,因为js是基于原型prototype的语言,每创建一个对象时,都有一个原型pototype用于指向其继承的属性、方法, 这些通过prototype继承的方法并不是对象自身的
-
每次通过类创建一个新对象时,this指向的属性和方法都会得到相应的创建
-
通过prototype继承的属性或者方法是每个对象通过prototype访问到,每次通过类创建一个新对象时这些属性和方法不会再次创建
-
通过prototype的属性和方法是共有属性和方法
var Book = function(id, name, price) {
// 私有属性
var num = 1;
// 私有方法
function checkId() {
}
// 特权方法
this.getName = function() {
return this.name
}
this.getPrice = function() {
return this.price
}
this.setName = function() {
this.name = name
}
this.setPrice = function() {
this.price = price
}
// 对象公有属性
this.id = id
// 对象公有方法
this.copy = function() {}
// 构造器
this.setName(name)
this.setPrice(price)
}
// 类静态公有属性(对象不能访问)
Book.isChinese = true;
// 类静态公有方法(对象不能访问)
Book.resetTime = function(){
console.log('new Time')
}
Book.prototype= {
// 公有属性
isJSBook: false,
// 公有方法
display: function(){}
}
-
constructor 是一个属性
-
当创建一个函数或对象时,都会为其创建一个原型对象prototype
-
在prototype 对象中又会像函数中创建this一样创建一个constructor属性 (prototype 在单独 的constructor 里, _ proto里也有constructor,这个里面是 proto_属性)
-
那么construcrot属性指向的就是拥有整个原型对象的函数或对像
-
通过new 关键字创建的对象实质是对新对象this的不断赋值
-
并将prototype指向类的prototype所指向的对象
-
但是 类 的构造函数外面通过“.”语法定义的属性方法是不会添加到新创建的对象上去的
-
要想使用属性和方法,可以在原型prototype上定义
2. 闭包实现封装类
var Book = (function(){
// 静态私有变量
var bookNum = 0
// 静态私有方法
function checkBook(name) {}
// 创建类
function _book(newId, newName, newPrice){
// 私有变量
var name, price;
// 私有方法
function checkID(id){}
// 特权方法
this.getName = function(){};
this.getPrice = function(){};
this.setName = function(name){
this.name = name
}
this.setPrice = function(price){
this.price = price
}
// 公有属性
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) {
// 判断执行过程中 this 是否是当前这个对象(如果是说明是new创建的)
if(this instanceof Book) {
this.title = title
this.time = time
this.type = type
} else {
// 否则重新创建这个对象
return new Book('JavaScript', '2014', 'js')
}