封装:

  • 一把对象系统,封装是由语法解析来实现的,即语法作用域;但js是动态语言,因此只能依赖变量作用域;
  • js的变量作用域只有表达式,函数,全局三种;所以js只能实现public和private两种封装性;            //js中类表现为构造器:
    function MyObject () {
    //private
    var data = 100;
    function _run(v) {
    alert(v);
    }
    //pbulic
    this.value = 'the data is ';
    this.run = function() {
    _run(this.value + data);
    }
    }
    var obj = new MyObject();
    obj.run();

多态:

  • 类型的模糊(as):js是弱类型的,因为任何一个实例的类型都是基本类型中的object,因此js这种语言本身就是类型模糊的;
  • 类型的确认(is): 
    • instanceof判断;
    • 实例能否使用该方法取决于它有没有该方法,而不取决于它是不是某种类型;
    • js无法依赖父类的同名方法;

实现:

  • 一般方法:

    • 在构造器中写this实例引用;    //这里并没用到原型

      function MyObject1() {
      this.name = 'jinks';
      }
      var obj1 = new MyObject1();
    • 在构造器中直接返回对象(实例);//这里并不是返回这个构造器的原型;
      function MyObject2() {
      var name = 'jinks';
      return {
      name : name
      }
      } var obj2 = new MyObject2();
    • 修改原型;
      function MyObject3() {
      
      }
      MyObject3.prototype.name = 'jinks';
      MyObject3.prototype.age = '22';
      var obj3 = new MyObject3();
    • 重写原型;
      function MyObject4() {
      
      }
      MyObject4.prototype = {
      name : 'jinks',
      age : '22'
      }
      MyObject4.prototype.constructor = MyObject4;
      var obj4 = new MyObject4();
    • 继承原型;
      MyObject5.prototype = new ParentClass();
  • 类抄写:demo
    • 成员总是指向父类的构造器;
    • 实例构造逻辑:先传入父类this引用抄写父类方法,然后是传入子类this引用抄写子类方法;后者会覆盖前者;
    • 优点:不追溯原型链,所有属性都在实例属性表中,效率高;
    • 缺点:
      • 以内存开销换效率;  //创建实例其每个方法都要初始化;
      • 不能用instanceof检测继承关系;
  • 原型继承
    • 以时间换空间,继承层次中邻近的成员访问最快,访问一个不存在的成员最久;   //  与其被设计出来时的应用环境有关;
  • 选择(参考):在大型系统上用类继承的思路;在小型结构或体系的局部使用原型继承思路;

对象属性:

  • 内部属性:不能通过脚本来访问,具体定义与使用都与引擎自身的实现有关;
  • 数据属性:
    • 数据描述://至少有value或writable两个之一

      • value            //undefined
      • writable        //false
    • 性质描述:
      • enumerable             //false
      • configurable            //false
  • 存取属性:
    • 存取描述://至少有set或get两个之一

      • get                      //undefined
      • set                     //undefined
    • 性质描述
      • enumerable             //false
      • configurable           //false
  • 直接量形式:
    • 对象直接量中不存在对ennumerable,configurable的定义,默认为true;
    • writable值按照语法分析而定,一般为true;

定制对象属性:

  • Object.defineProperty(obj,name,desc);
  • Object.defineProperties(obj,props) : 在js引擎内部,事实上从props中for/in所有的name取出desc值,并以它们为参数逐一调用defineProperty();
  • Object.getOwnPropertyDescriptor(obj,name);
  • Object.create(prototypeObj,PropertyDescriptors): 在这个方案中,不需使用构造器,而是使用'原型继承+属性定义';
    function aCreator(proto, props) {
    if(!(prop instanceof Object)) throw TypeError
    var obj,_proto_ = Object.prototype;
    try{
    Object.prototype = proto;
    obj = new Object();
    }
    finally {
    Object.prototype = _proto_;
    }
    Object.defineProperties(obj,props);
    return obj;
    }

属性状态维护:

  • 获取属性:

    • getOwnPropertyNames(obj)                        //取对象自有的属性名数组;
    • keys(obj)                                                 //取对象自有的,,可见的属性名数组
  • 状态维护: //由原型继承来的属性同样会受影响; 以当前对象为原型时,子类可以通过重新定义同名属性来覆盖这些状态‘

    • preventExtensions(obj)                            //使实例obj不能添加新属性;
    • seal(obj)                                                //使实例obj不能添加新属性;也不能删除既有属性;
    • freeze(obj)                                            //使实例obj所有属性只读;且不能添加,删除属性;
  • 状态检查:
    • isExtensible(obj);
    • isSealed(obj);
    • isFrozen(obj);

js:语言精髓笔记8--对象系统的更多相关文章

  1. js:语言精髓笔记12--动态语言特性(2)

    对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...

  2. js:语言精髓笔记9--函数式语言特征

    形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...

  3. js:语言精髓笔记7----原型继承

    面向对象有三个基本特性:封装,继承,多态:如果都满足的话称为面向对象语言:而部分满足则称为基于对象语言: 数据类型实现模型描述: JavaScript对象模型: 构造过程:函数->构造器 构造器 ...

  4. js:语言精髓笔记5----语言分类

    计算模型:源于对计算过程的不同认识: 1.基于不同计算模型一般分为://教科书的一般分类 命令式语言: 函数式语言: 逻辑式语言: 面向对象程序设计语言: 2.基于程序本质分类:  //编程的经典法则 ...

  5. js:语言精髓笔记1--标识符与基本类型

    标识符: 命名: 语法以及类型----语法关键字                                           //逻辑 值(的存储位置)----变量和常量           ...

  6. js:语言精髓笔记4----面向对象概要与运算符二义性

    实例创建:obj = new contructor[(arguments)]; //如果没有参数可以忽略括号:所以注意这不是函数调用: 直接量与初始器:在之前的基本表达式中将直接量与初始器分开,这时因 ...

  7. js:语言精髓笔记11--动态语言特性(1)

    语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类: 动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系:JS是完全动态语言,导致其不确定性一般 ...

  8. js:语言精髓笔记10--闭包

    闭包:  //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...

  9. js:语言精髓笔记6----作用域

    js基础语法:由语句.表达式和变量构成:   语句是主要表达方式:单语句->复合语句(代码块)->程序片段(函数):js中没有单元和程序的概念: 作用域: 语法作用域与变量作用域的区别:前 ...

随机推荐

  1. 给setTimeout和setIntreval函数添加回调参数

    setTimeout和setInterval是两个很常见的计时函数.在以前,他们只接收两个参数,我们无法直接向他们的回调函数中添加参数,如果需要实现添加多个参数,可以在外层多嵌一层来实现类似的功能.现 ...

  2. Java基础—ClassLoader的理解

    ##默认的三个类加载器 Java默认是有三个ClassLoader,按层次关系从上到下依次是: - Bootstrap ClassLoader - Ext ClassLoader - System C ...

  3. xpath基础知识

    相关链接: http://www.ruanyifeng.com/blog/2009/07/xpath_path_expressions.html 自动生成xpath的工具: http://blog.s ...

  4. Android/iOS微信6.3.5同时发布更新 支持群视频聊天、群公告

    下午微信6.3.5发布更新,新版最大变化就是支持群视频聊天,又一次向手机QQ靠拢.在群管理方面,支持发布群公告,支持群主转让给其他群成员,同样都是QQ玩剩下的功能.另外,新版支持微信运动查看步数图表. ...

  5. cocos2d-x 在android环境下开发遇到的一些bug

    今天在弄一个关于android环境下解析xml的东东,遇到了2个比较麻烦问题 1.android的apk下文件是压缩文件,io.open模式无法读取到数据的, 解决思路就是: CCFileUtils: ...

  6. 第11章 使用Vsftpd服务传输文件

    章节简述: 本章节先通过介绍文件传输协议来帮助读者理解FTP协议的用处,安装vsftpd服务程序并逐条分析服务文件的配置参数. 完整演示vsftpd服务匿名访问模式.本地用户模式及虚拟用户模式的配置方 ...

  7. request-log-analyzer日志分析

    (这些文章都是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 日志分析是常见的工作,方法如下: 使用工具:request-log-analyzer安装:$ ...

  8. 前端 解决swiper js 手动滑动一下后不能自动播放

    用户操作swiper之后,是否禁止autoplay.默认为true:停止.如果设置为false,用户操作swiper之后自动切换不会停止,每次都会重新启动autoplay.操作包括触碰,拖动,点击pa ...

  9. 坚持不懈之linux haproxy 配置文件 详情

    ####################全局配置信息######################## #######参数是进程级的,通常和操作系统(OS)相关######### global maxc ...

  10. python 最佳入门实践

    勿在浮沙筑高台,无论什么技术,掌握核心精神和api,是很重要的. 但是入门过程也可能不是一帆风顺的,这里有八个入门任务,看看你完成了没有: http://code.tutsplus.com/artic ...