面向对象
面向对象:是一种编程思想; 先不做东西,分析东西怎么构成的,抽象成几个部分或者步骤 分由不同的人负责不同的部分,各自完成,然后组装 会考 虑复用的问题,把能用的东西留下来,便于下次用,像是把函数包装一下,在很多地方可以去调用
OOP:面向对象的英文
高内聚 低耦合 就是面向对象的一种方法;高内聚:把实现功能的东西能放在一起,低耦合就是各个模块之间的关联越少
java c++ php python
面向过程:也是一种编程思想; 就是一点点一步步的做,没有分为几个部分 全程一个人去做,做完一个再做下一个 不考虑复用的问题
C
面向对象:类的继承 封装 多态
JS中的内置类 :自带的类:Array(数组类) String(字符串类) Number(数字类) Boolean(布尔类) Object(对象类) NodeList Function(函数类)
[1] '12' 1 true {} f(){}
var ary = [1];//字面量的方式创建的数组类的实例
var ary2 = new Array('1','1');//构造函数的方式创建的数组类的实例; 这两种创建方式没有区别
var ary3 = new Array(10);//如果参数只有一个,并且是数字的时候,这个数字代表这个数组的长度
console.log(ary,ary2,ary3);
//new 创造出来的东西都是引用数据类型
var str = '';
var str2 = new String();
console.log(str == str2);//true
console.log(str === str2);//false 这里的str2的数据类型变成了object
设计模式
几种常见的设计模式:
单例模式:单个的实例;就是一个对象,可以避免命名冲突的问题;这个对象名我们也称为命名空间;一般使用单例可以用来封装一些工具函数 库
工厂模式:
构造函数模式
原型模式
高级单例模式:也是一个对象,只是是由一个函数返回的一个单例(闭包),使别人不能轻易获取里面的内容,一般也是在模块化开发里使用
//高级单例
function fn () {
var name = 'zhufeng';
var age = 12;
function init () {
console.log(name,age);
}
return {
init
}
}
var obj = fn ();//{init}
工厂模式:就是一个函数;然后返回一个单例;批量产生单例。与高级单例模式的区别是高级单例模式一般没有传参数
//单例模式的对象可以变成下面的函数,这样,只用输出参数,可以批量产生单例
function factory (name,age,sex) {
var obj = {
name,sex,age,
eat(){},
play(){},
}
return obj
}
var per1 = factory('xiaoming',12,1)
function factory (name,age=12,sex = 1,cb) {//这种es6最新的默认赋值方式,只有在传入的实参是undefined的时候才走默认值
name = name || '1'//这是es5的时候给默认值的方式
cb && cb();//cb回调函数, 如果没有传回调函数就不执行,传了才执行 es5的时候
var obj = {
name,sex,age,
eat(){},
play(){},
}
return obj
}
构造函数模式:一般用来造一些插件 缺点:有些公用的东西没办法去公用
function Person (name,age,sex) {
this.name = name;
this.age = age;
this.eat = function(){};
this.play = function(){};
return {
1:1,
name
}
}
var per2 = Person('zf',12,1);
var per22 = new Person('zf',12,1); //这里Person是一个类,per22是Person的一个实例
console.log(per22);//是Person的一个实例
//new执行函数的时候,函数内部的this都是指向了一个堆内存,函数执行完成之后,又把this返出去,默认返回值是this
//若写了返回值,但是是个值类型,那么默认返回仍然是this
//若返回值是个引用数据类型,那么返回值就默认是这个引用数据类型
//es6的箭头函数不能通过new的方式执行的
//es6 创造类的方式 是通过 class创造的
// var FN2 = ()=>{
// this.name = 123;
// }
// console.log(new FN2);//报错
class FN3{
constructor(name,age){ //constructor这个词是写死的词,不能换
this.name = name;
this.age = age;
}
}
var f3 = new FN3('xiaoming',122);
原型模式:在构造函数的基础上加了一个原型(prototype) 的概念 优点是 公用 省空间
function Person (name='zf',age=10,sex=1){
this.name = name;
this.age = age;
this.sex = sex;
}
console.log(Person.prototype);//prototype是Person这个的原型
//在原型上放的属性都是这个类公用的属性
Person.prototype.eat = function(){
console.log('吃')
}
Person.prototype.play = function(){
console.log('玩')
}
var p1 = new Person();
var p2 = new Person();
console.log(p1,p2);//这时,p1和p2的eat和play可以调用,但是不占用它自己的堆内存
//查找属性时,先在自己身上查,没有就去原型上查
p1.eat = function () {
console.log('吃')
};//这时就给p1自己加了一个eat属性
//es6的原型怎么写?
class FN { //class声明的东西,类,只能通过new 方式执行;
constructor(name,age){
this.name = name;
this.age = age;
}//这里constructor其实就相当于上面的函数体
//下面的就相当于prototype 部分,而且格式必须是简写格式,如下,而且添加的原型属性必须是个函数,不能是别的类型
eat(){
}
play(){
}
}
var f = new FN;
console.log(f);