• 什么事面向对象

    • 用对象的思想去写代码,就是面向对象编程
  • 面向对象编程(OOP)的特点
    • 抽象:抓住核心问题

    • 封装:只能通过对象来访问方法

    • 继承:从已有对象上继承出新的对象

    • 多态:多对象的不同形态

  • 对象的组成
    • 属性——对象下的变量
    • 方法——对象下的函数
    • this指向
      • 指的是该方法的调用对象
  • 工厂方式
    • 面向对象中的封装函数
    • 当new去调用一个函数:这个时候函数中的this指向该函数对象,并且会隐式返回该函数对象。(相当于新创造的对象,不依附于任何其它对象)
    • new后面的函数就叫做构造函数
    • !关于new与this的关系:实际上new后面调用的函数是一种特殊的函数叫做构造函数,用于创建一个对象,但是new的语法规定构造函数中的this就是将要创建的对象,因此直接用this指代对象而没有必要重新创建一个对象(var obj= new Object()),并且为了简化构造函数,语法中同时规定构造函数执行完会自动返回this,即自动返回创建出来的对象;所以说在构造函数中,this的使用节省了对象的创建,而new的使用节省了对象的返回;
  • 对象类型的引用
    • 基本类型(数字,字符,布尔值):赋值的时候是值得复制;
    • 对象类型:赋值操作实际上是引用的传递,多个对象公用一个地址;
    • 通过a=[];这种形式赋值那么必定会建立一个新地址。
    • 在构造函数中创建的对象方法每new出一个新的对象调用该方法都会在内存中生成一份新的方法,所以重复创建对象会使得构造函数中的对象方法重复被创建,占内存拖累性能。
  • 原型    
    • 将方法写到原型中而不是写到构造函数中,可以避免方法的重复创建。
    • 去改写对象下面公用的方法或者属性,让公用的方法或者属性在内存中只存在一份(提高性能)。
    • 原型要写在构造函数的后面,this指向该构造函数对象。
    • 优先级原型要低于普通写法。
    • 面向对象的改写原则
    • 先写出普通的写法,然后改成面向对象写法

      • 将局部变量改为全局变量

      • 尽量不要出现函数嵌套函数

      • 把onload中不是赋值的语句放到单独initial()函数中

    • 改成面向对象

      • 全局变量就是属性

      • 函数就是方法

      • Onload中创建对象

      • 改this指向问题

      • 事件函数中ev的处理
  • 基本类型都有自己的包装对象
    • String
    • Number
    • Boolean
    • 基本类型没有属性和方法,而是隐式调用了各自对应的包装对象,所以要给基本类型添加方法或者属性,要加在其包装对象上。
    • 当基本类型调用其对应的包装对象下的方法的时候,基本类型会找到对应的包装对象类型,然后包装对象吧所有的属性和方法给了基本类型,然后包装对象消失。
  • 原型链
    • 实例对象与原型之间的链接
    • _proto_ (隐式链接)
    • 最外层原型链:Object.prototype;(优先级从内向外,普通写法的优先级最高)

面向对象的一些属性和方法

  • hasOwnProperty:看是不是对象自身下面的属性;此方法在最外层object.prototype.hasOwnProperty;
  • constructor:查看对象的构造函数;每一个函数都会自动生成的;fn.prototype.constructor=fn;
    • 原型的赋值如果用json的形式,需要手动加上constructor的指向,否则默认生成的constructor会被覆盖;

      • Aaa.prototype.name='xioaming';Aaa.prototype.age=20;//这种方法相当于添加属性;
      • Aaa.prototype={name:'xiaoming',age:20};//相当于赋值,原有的prototype会被覆盖,所以系统自动生成的constructo也会一并被覆盖;应该手动添加Aaa.prototype={constructor:Aaa,name:'xiaoming',age:20}
    • constructor系统自动添加的,for in循环不到,即使是手动添加constructor也不行;
    • arr.constructor==Array //判断数据类型(跨页面的情况下会失效,例如ifream中的类型判断)
    • instanceof : 运算符
      • 对象与构造函数是否在同一个原型链上。

        • arr instanceof Array //判断数据类型(跨页面的情况下会失效,例如ifream中的类型判断)
      • toString:改变数据类型,或者将数字变成任意进制。
        • alert(Object.prototype.toString.call(arr)=='[object,Array]'); //靠谱的判断对象类型的方法
        • arr.toString();//数组转成字符串;
        • num.toString(16);//数字转成任意进制;
        • 位置:系统对象自身的原型下都自带toString;自己写的对象是通过原型链找到object原型下的toString
  • 对象的继承

    • 在原有对象的基础上,略作修改,得到一个新的对象 不影响原有对象的功能
  • 如何添加继承
    • 属性的继承:调用父类的构造函数,通过 call 修改this指向。
    • 方法的继承:
      • 类式继承(一行代码的继承方式)直接将父类的原型对象赋给子类的原型对象。CreateStar.prototype=CreatePerson.prototype;(但这种方式会造成对象的引用,修改子类会改变父类,可以通过将属性与方法分开进行继承的方式进行继承)
      • 利用for in 进行拷贝继承。//靠谱的属性继承方式
        • 对象属性通过call方法直接拷贝到子对象上;
        • 原型上的方法通过for in循环拷贝到子对象的原型链上(函数比较特殊的一种对象,函数的赋值不是引用而是像基本类型一样直接在内存中复制了一份,所以不会因为赋值后的函数被修改影响到赋值前的函数)
        • 用到的函数extend()
        • function extend(obj1,obj2){
          for( attr in obj2 ){
          obj1[attr] = obj2[attr];
          }
          }     
      • 原型继承
  • 组件的开发
    • 面向对象的深入应用(UI组件,功能组件)
    • 将配置参数,方法,事件,三者进行分离
    • 创建自定义事件
      • 有利于多人协作开发代码
      • 如何去挂载自定义事件与事件函数

js面向对象的更多相关文章

  1. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  2. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  3. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  4. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  5. JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  6. js面向对象的实现(example 二)

    //这个方法和上篇文章(js面向对象的实现(example 一))中的方法类似,但是更为简洁 //通过函数赋值的方式来构造对象 //同样通过闭包的方式来封装对象及内部变量 (function () { ...

  7. 浅谈JS面向对象之创建对象

    hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言有很大的意义. 首先什么是面向对象编程(oop),就是用对象的思 ...

  8. js面向对象,有利于复用

    需求:在网页上添加个天气预报. 以前总是在需要执行js的地方,直接写function(){}.在需要同样功能的地方直接copy,或者稍微修改. 然后在网上看看有没有好点的方法,然后就看到js面向对象编 ...

  9. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  10. 原生JS面向对象思想封装轮播图组件

    原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能 ...

随机推荐

  1. 完整部署CentOS7.2+OpenStack+kvm 云平台环境(3)--为虚拟机指定固定ip

    之前在测试环境(centos7.2)上部署了openstack云平台(完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建),openstack在neutron组网 ...

  2. jquery版固定边栏滚动特效

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. int[] convert byte[]

    private void button_Click(object sender, RoutedEventArgs e) { byte[] bytes = this.ConvertIntArrayToB ...

  4. iOS App上架流程(2016详细版)

    iOS App上架流程(2016详细版) 原文地址:http://www.jianshu.com/p/b1b77d804254 感谢大神整理的这么详细 一.前言: 作为一名iOSer,把开发出来的Ap ...

  5. typedef

    第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, ...

  6. java学习笔记之泛型

    "泛型"这个术语的意思就是:"使用与许多许多的类型".泛型在编程语言中出现时,其最初的目的是希望类或方法能够具备最广泛的表达能力.如何做到这一点呢,正是通过解耦 ...

  7. 【codeforces 749E】 Inversions After Shuffle

    http://codeforces.com/problemset/problem/749/E (题目链接) 题意 给出一个1~n的排列,从中等概率的选取一个连续段,设其长度为l.对连续段重新进行等概率 ...

  8. 关于push数组,然后遍历数组遇到的坑,遍历显示函数

    我偷了个懒将点击的东西push进一个arr里,然后遍历显示在上面. 为啥子出现了上函数,什么鬼什么鬼.我检查很久都不晓得那里push进去的. 一个小时后,我想想要不看看arr里面的结构吧! 尼玛!为啥 ...

  9. Jackson 通过自定义注解来控制json key的格式

    Jackson 通过自定义注解来控制json key的格式 最近我这边有一个需求就是需要把Bean中的某一些特殊字段的值进行替换.而这个替换过程是需要依赖一个第三方的dubbo服务的.为了使得这个转换 ...

  10. C#基础练习

    1.冒泡排序 namespace _0 { class Program { public static int[] BubbleSort(int[] arr) { ; i < arr.Lengt ...