《JavaScript 设计模式》阅读笔记之第二章:面向对象编程
本章用实例详细呈现了面向对象编程的三大特点:封装,继承,多态。
易混淆概念
类有三部分组成:
1、构造函数内,实例化对象复制使用。
2、构造函数外,类通过点语法添加的,仅类可用。
3、类原型,实例化对象共用。
构造函数式继承是指仅继承了类中构造函数内的部分。
公有:(函数内通过 this 定义 ) 对应 私有(函数内局部变量/方法 函数作用域)
共有:类原型上定义
静态:类 . 点语法定义
<script>
//2.1 两种编程风格,面向过程 VS 面向对象
//面向过程:用函数实现
//面向对象:需求抽象为对象,方便重复使用和修改。
//2.2 封装
//声明一个函数保存在变量(代表类的变量名,首字母大写)里,在函数内部使用this添加属性和方法。
//通过this添加的属性和方法,在使用类创建新对象时,每个对象都会复制一份,并且可以在外部访问到,由此可看作是对象的公有属性和方法。
//在原型上添加属性和方法,有两种方法。两种方法不能混用,如果混用,后定义的会完全覆盖先定义的。
//方法一:为原型对象的属性赋值
var Book=function(id,name,price){
this.id=id;
this.name=name;
this.price=price;
}
Book.prototype.display=function(){
console.log("展示这本书")
}
//方法二:为原型对象赋值
Book.prototype={
display:function(){
console.log("展示这本书")
}
}
var book=new Book(10,'javascript 设计模式',59)
console.log(book.name)
//js函数作用域,声明在函数内部的变量及方法在外界访问不到,通过此特性可创建类的私有变量和私有方法。
var Book=function(id,name,price){
//私有属性
var num=1;
//私有方法
function checkId(){
console.log(id)
};
//公有方法又称特权方法
//初始化实例对象
this.getName=function(){console.log("getName")};
this.getPrice=function(){console.log("getPrice")};
this.setName=function(){console.log("setName")};
this.setPrice=function(){console.log("setPrice")};
//对象公有属性
this.id=id;
//对象公有方法
this.copy=function(){}
//构造器(调用特权方法)
this.setName(name)
this.setPrice(price)
}
//类外面通过点语法添加的属性和方法,在使用new关键字创建新对象时没有执行到(静态属性/方法),所以新创建的对象无法访问这些属性和方法,但可以通过类来使用。
//类 静态属性(对象不能访问)
Book.isChinese=true;
//类 静态方法(对象不能访问)
Book.resetTime=function(){
console.log("resetTime")
}
Book.prototype={
//原型共有属性
isJsBook:true,
//原型共有方法
display:function(){
console.log("展示这本书")
}
}
var b=new Book(10,'javascript 设计模式',59);
console.log(b.num) //undefined
console.log(b.isJsBook) //true
console.log(b.id) //10
console.log(b.isChinese)//undefined
console.log(Book.isChinese)//true
Book.resetTime()//resetTime
//闭包
//在一个函数内部创建另一个函数,内部函数可以访问外部函数作用域中的变量。
//有时将类的静态变量通过闭包实现
var Book=(function(id,name,price){
//静态私有变量
var bookNum=0;
//静态私有方法
function checkBook(){console.log("checkBook")}
const