面向对象有三个基本特性:封装,继承,多态;如果都满足的话称为面向对象语言;而部分满足则称为基于对象语言

数据类型实现模型描述:

JavaScript对象模型:

构造过程:函数->构造器

  • 构造器首先是一个函数,可以理解为函数初始化的时候其prototype是无值的,只有在需要引用到原型时,才具有构造器的的特性;
  • 函数的原型总是一个标准的、系统内置的Object()构造器的实例;
  • 该实例创建后construct属性总先被赋值为当前函数;

继承复制:

  • 构造复制:每构造一个实例就从原型中复制一个映像,它和原型占用了相同的空间;
  • 写时复制:每构造一个实例就使其指向原型;当读的时候顺着指示去读原型;当写对象的时候才将原型复制下来;以后读没写过的实例顺着指示,写过的则直接访问映像;
  • 优化的写复制(也是js原型继承采用的):把写复制的粒度从原型变成成员,仅当要写某个实例的成员时,将成员的信息复制到实例映像中,产生一张成员列表;
    • 确保在读取的时候成员表首先访问到;
    • 如果在成员表中找不到,则沿着对象遍历整个原型链;

空对象(null):

  • 属于对象类型,所以可以进行枚举;
  • 对象是空值,所以枚举不出任何属性或方法;
  • 不是来自Object()构造器的实例,instanceof返回false   //null instanceof Object;

空的对象({}/new Object()):

  • 空的对象只有预定义的属性和方法,这些并不会被枚举到;
  • 空的对象是所有对象的基础;
  • Object()构造器的原型就是一个空的对象;
  • 构造:根据继承复制,可以理解空对象的基本构造为
    • 一个^proto指向Object.prototype;
    • 一个^proto指向一个空表;

预定义属性和方法:

  • 原型(Object.prototype):

    • toString                                               //动态语言
    • toLocaleString                                      //动态语言
    • valueof                                                //动态语言
    • construct                                             //对象系统:构造
    • propertyIsEnumerable                          //对象系统:属性
    • hasOwnProperty                                   //对象系统:属性
    • isPrototypeof                                        //对象系统:原型
  • 构造器(一般函数):
    • call                                                     //函数式语言
    • apply                                                  //函数式语言
    • caller                                                  //函数式语言
    • bind                                                   //函数式语言
    • arguments                                          //动态语言
    • length                                                //动态语言
    • prototype                                           //对象系统:原型
  • EM5对Object()构造器扩展:
    • create                                               //对象系统:构造
    • getPrototypeOf                                  //对象系统:原型
    • defineProperty                                   //对象系统:属性
    • defineProperties                                 //对象系统:属性
    • getOwnPropertyDescriptor                  //对象系统:属性
    • keys                                                 //对象系统:属性
    • getOwnPropertyNames                       //对象系统:属性
    • seal                                                  //对象系统:属性
    • freeze                                               //对象系统:属性
    • preventExtensions                             //对象系统:属性
    • isSealed                                           //对象系统:属性
    • isFrozen                                           //对象系统:属性
    • isExtensible                                     //对象系统:属性

 原型链:

  • constructor的维护:

    • 在重置原型后就修改原型的constructor属性;

      MyObjectEx.prototype = new MyObject();
      MyObjectEx.protptype.constructor = MyObjectEx;
    • 在构造器内初始化实例时保证constructor属性;
      function MyObjectEx() {
      this.constructor = arguments.callee;
      }
  • 原型链prototype;
  • 内部原型链:
    • 面向对象继承性的约定:子类必须与父类具有相似性;
    • 对象实例内部有_proto_属性,用户无法访问;即使修改constructor,也不用担心实例与父类的一致性;
    • 总结:内部原型链是JS原型继承机制所需的,而通过constructor与prototype所维护的构造器原型链是用户代码回溯的时候需要的;

 原型继承的实质:

  • 基于原型继承的对象系统:将对象(类)的继承关系与对象(类)的行为描述进行分离; //理论上可以先构建一个没有任何成员的继承系统,然后不断修改原型。

js:语言精髓笔记7----原型继承的更多相关文章

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

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

  2. js:语言精髓笔记8--对象系统

    封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...

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

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

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

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

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

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

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

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

  7. js:语言精髓笔记2--表达式

    表达式:由运算符和运算元构成:JS中没有运算符的表达式称为单值表达式:没有运算元,孤立与代码上下文的运算符是不符合语法的:(表达式是有返回值的) 单值表达式: this引用: 变量引用: 直接量: n ...

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

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

  9. js:语言精髓笔记13--语言技巧

    消除代码全局变量名占用: //本质是使用匿名函数: void function(x, y, z) { console.log(x + y + z); }(1,2,3); //要使函数内的变量不被释放, ...

随机推荐

  1. Android Bitmap 全面解析(四)图片处理效果对比 ...

    对比对象: UIL Volley 官方教程中的方法(此系列教程一里介绍的,ImageLoader的处理方法和官方的差不多) -------------------------------------- ...

  2. [Effective JavaScript 笔记]第32条:始终不要修改__proto__属性

    __proto__属性很特殊,它提供了Object.getPrototypeOf方法所不具备的额外能力,即修改对象原型链接的能力. 避免修改__proto__属性的最明显的原因是可移植性的问题.并不是 ...

  3. ruby实时查看日志

    (文章是从我的个人主页上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com) 在调试代码的时候,把日志文件打开,边操作边调试能很快帮助我们发现系统中存在的问题. $tail r ...

  4. Coursera台大机器学习课程笔记11 -- Nonlinear Transformation

    这一节讲的是如何将线性不可分的情况转为非线性可分以及转换的代价.特征转换是机器学习的重点. 最后得出重要的结论是,在做转换时,先从简单模型,再到复杂模型. 参考:http://www.cnblogs. ...

  5. nginx学习(一):基本安装

    转载自http://summervast.blog.51cto.com/690507/385511 注意:可能因版本不同,个别指令不起作用,需要注意版本灵活安装,我在安装时也遇到过此问题 开始学习ng ...

  6. poj1258 Agri-Net 最小生成树

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 44032   Accepted: 18001 Descri ...

  7. Linux SUID SGID 讲解

    SUID属性 UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢? 是这个进程的运行用户的(有效)ID,包括user id和group id.用户可以用id命令来查到自己的或其他用户的user ...

  8. 代码风格与树形DP

    Streaming很惨,不过因为比赛之间没有提交过就没掉(或掉了)rating.第二题是一个树形DP,但是我都在想第一题了,简直作死. 看着神犇的代码我也是醉了...各种宏,真是好好写会死系列. 看到 ...

  9. Linux: xclip,pbcopy,xsel用法 terminal 复制粘帖 (mac , ubuntu)

    ubuntu下的用户可以只用apt-get来安装: sudo apt-get install xclip echo "Hello, world" | xclip mac下使用pbc ...

  10. 【Hibernate】Hibernate系列1之概述

    概述 Hibernate简介 1.2.安装hibernate tools插件 1.3.HelloWorld示例 1.3.1.加入jar包 1.3.2.开发步骤 hibernate generator ...