JavaScript面向对象(oop) — Object Oritented Programming

OOP即面向对象程序设计,全称为Object Oriented Programming,是一种计算机编程架构。

声明对象:

  1. 字面式声明
  2. New
  3. 构造函数声明
  4. 工厂方法声明
  5. 原型模式声明
  6. 混合模式声明

声明完对象,看下如何遍历对象中的属性和方法,继承等方面内容

  1. 遍历属性和方法
  2. 封装,原型,原型链
  3. 继承:原型继承,构造函数继承,call(),apply()
  4. 对象冒充

面向对象

对代码的一种抽象,对外提供统一调用接口的编程思想。

基于原型的面向对象

基于原型的面相对象中,对象(object)则是依靠构造器(constructor)利用原型(prototype)构造出来的。

JavaScript面向对象的名词解释

属性:事物的特性
方法:事物的功能
对象:事物的一个实例
原型:JavaScript函数中由prototype属性引用了一个对象,即原型对象
所有的函数都有一个prototype属性。

人和汽车:
属性: 人 — 名字、身高、年龄 汽车 — 长、宽、高、颜色

方法: 人 — 学习、玩耍、唱歌 汽车 — 拉人、载货

对象:事物的一个实例 —- 众多人中一个人

image.png

  1. var obj = new Function("a","b","return a+b");
  2. var s = obj(2,5);
  3. alert(s);

注意如下:

  1. 只要通过new Function() 的对象,都是函数对象
  2. 其余的都是普通对象

闭包

image.pngimage.png
闭包是一个拥有很多变量和绑定了这些变量的环境的表达式(通常就是一个函数)

  1. 变量作用域:
  2. 全局作用域
  3. 函数作用域(局部作用域) ```html function a(){//在函数内部套用函数

    1. var i= 0;//这边的局部变量就可以被外部读取
    2. function b(){//上一个函数的局部变量就变成了被包裹函数的全局变量
    3. alert(++i);
    4. }
    5. return b;

    } var c = a(); c();//1 特点:函数b实在a内嵌套的,函数a需要返回函数b //用途:1、读取函数内部变量 2、让i变量得值保存在内存中

    function f1(){

    1. var n = 99;//这边的var n=99就相当于下面f2函数的全局变量
    2. nAdd = function (){
    3. n=n+1;
    4. }
    5. function f2(){
    6. alert(n);
    7. }
    8. return f2;

    } var rs = f1(); rs();//99 只执行了re nAdd没有执行基本可以算是跳过 nAdd(); rs();//100 — rs就是f2函数的闭包函数

  1. <a name="YRUQi"></a>
  2. ## 闭包优缺点:
  3. 优点:有利于封装,可以访问局部变量的<br />缺点:内存占用浪费严重,内存泄漏 -- 黑客攻击内存
  4. <a name="HmYiS"></a>
  5. ## 对象声明方式
  6. <a name="chEly"></a>
  7. ### js字面式对象声明
  8. ```html
  9. var obj = {
  10. 属性名:属性值
  11. 方法名:funcrtion(){}
  12. };

image.png

new操作符后跟Object构造函数

  1. var obj = new Object();
  2. obj.属性 = 属性值;
  3. obj.方法 = function(){}
  4. Object是所有对象的基类,根所有的JavaScript对象都是由object延伸的。

image.png

JavaScript构造方法声明对象

  1. function test([参数列表]){
  2. this.属性 = 属性值;
  3. this.方法 = function(){
  4. 方法的代码;
  5. }
  6. }
  7. var obj = new test(参数列表);

image.png

JavaScript的工厂方式声明对象

拓展 — 工厂模式

  1. function createObj(name,age){
  2. var obj = new Object();
  3. obj.属性 = 属性值;
  4. obj.方法 = function(){}
  5. return obj;
  6. }
  7. var box1 = createObj("liski",100);
  8. var box2 = createObj("wanger",200);

image.png

JavaScript中原型模式声明对象

  1. function test(){}
  2. test.prototype.属性 = 属性值;
  3. test.prototype.方法 = function(){代码}
  4. var obj = new test();
  5. 好处:让所有的实例化的对象都拥有它包含的属性及方法

image.png

JavaScript混合模式声明对象

混合模式:构造模式+原型模式

  1. function test(v1,v2,v3){
  2. this.v1 = v1;
  3. this.v2 = v2
  4. this.v3 = v3
  5. }
  6. test.prototypt.方法 = function(){代码}
  7. var obj = new test();

遍历对象及存储

  1. //新建对象 -- ren
  2. for(var i in ren){
  3. //对象有的是可以当做数组处理的
  4. alert(i);//弹出的是属性和方法名字
  5. alert(ren[i]);//弹出的是属性和方法的内容
  6. }

对象在内存中的分布(存储)

image.png

封装

封装:把对象内部的数据和操作细节进行隐藏; private — 接口一般为调用方法
1、JavaScript中没有专门封装的关键词 可以使用闭包创建这种模式 — 函数内部声明的变量外部是无法访问的
2、能否被访问 取决于:公有和私有内容区别 — 能否在对象外部被访问

1、这种模式有点消耗内存,一直return 创建对象;
2、其实封装的本意就是局部的属性隐藏起来;

image.png

继承

继承:
1、原型:是利用prototype添加属性和方法
2、原型链:proto(对象的内置属性) — 用于指向创建他的函数对象的原型对象prototype
image.png
image.png

构造继承

1、在子类的内部构造父类的对象实现继承
image.png

call和apply的用法

对象内置方法中的apply和call都会用于继承,区别在于传参方式不同;
1、call:调用一个对象的一个方法,以另一个对象替换当前对象
2、Apply:应用某一个对象的一个方法,以另一个对象替换当前对象
image.png

image.png

JavaScript多继承方式如下,拓展了解:
image.png

JavaScript面向对象的关键词

关键词:
Instanceof delete call apply arguments callee this

对象冒充

将父类的属性和方法一起传给子类作为特权属性和特权方法
image.png