本文是学习和总结ECMAScript5.1规范形成的。是对规范中所提及的Javascript类型进行剖析后的个人观点的表达(如有Bug望各位道友指正)。主要是各类型的实例方法,不包含任务构造函数的方法。剖析的切入点如下:

1. 是否可以继承

2.通用方法、非通用方法,以及通用方法的使用。

名词解释: 通用:表示此方法可以被其他类型调用,也就是this指针可以改变 非通用:不可被其他类型调用,this指针只能是当前类型

一、Function与Object

var Cn = new Function("alert('1');this.a='a';");
var _cn = new Cn(); //_cn:Object类型;Cn:Function类型,new的Function,他的类型都是Object

new Function和关键字function是相同的作用,创建一个Function的实例。

实例方法 是否通用 说明
constructor 非通用  
toString 非通用  
toLocalString 非通用 为派生类提供接口
valueOf 非通用  
hasOwnProperty 非通用 不考虑原型链
isPrototypeOf 非通用 判断对象是否存在于指定对象的原型链上
propertyIsEnumerable 非通用 不考虑原型链

二、Array可以继承

every返回第一个为false的元素

实例方法 是否通用 说明
constructor 非通用  
toString 通用  
toLocaleString 通用  
concat 通用  
join 通用  
pop 通用  
push 通用  
reverse 通用 反转数组
shift 通用 删除数据第一个位置的元素,并返回
slice 通用 返回start和end之间的元素,start不被包含
sort 通用  
splice 通用 删除数据元素,以索引下标开始,个数
unshift 通用 在数组第一个位置插入元素
indexOf 通用  
lastIndeOf 通用  
every 通用 返回第一个为false的元素
some 通用 返回第一个为true的元素
forEach 通用  
map 通用  
filter 通用  

通用使用方法示例代码:

function CustomFn(){
this["0"] = "asfd";
this["1"] = "第二个";
this["2"] = "第三个";
this.length = 3;
}
var pt = CustomFn.prototype;
pt.join = Array.prototype.join;
pt.shift = Array.prototype.shift;
var cu = new CustomFn();
console.log(cu.join("-"));
cu.shift();
console.log(cu.join("-"));

注意:想要利用Array的通用方法,类的结果就得构建得像一个数组,所以我们必须满足数组两个必要的条件:

  • 下标:用0,1,2是为了表示数组索引下标;
  • 长度:length是为了表示数组的长度;

三、Number、String、Boolean、Date

String类型有些许的通用性方法,但Number、Boolean和Date却未能明确标记出通用性方法。方法细节此处就不存赘述,如想具体了解可查看ECMAScript5.1的规范。这里只给出一个Number使用String通用方法的示例代码:

function CustomNumber(){
}
var pt = CustomNumber.prototype;
pt.toString = function(){
return 134;
}
pt.ct = String.prototype.charAt;
var _num = new CustomNumber();
console.log(_num.ct(1)); Number.prototype.cCharAt = String.prototype.charCodeAt;
console.info((10).cCharAt(1));

注意点:

  1. 能被其他对象的引用的只有通用方法
  2. 重写基类的原型方法,如CustomNumber类的原型方法toString(重写的Object类的),为什么要重写toString,这个可从ecmaScript规范中获得,因为他在调用charAt、charCodeAt等方法是会先调用toString方法获取值。
  3. 类型转换:CheckObjectCoercible方法,内部还会调用ToObject方法,将基本类型转换为引用类型。

四、Error

用于显示或抛出程序运行时的异常信息,主要name、message等实例属性(可以设置的),Stack(只读,异常的堆栈信息)。

ECMAScript5.1派生类实现代码:

function Inherit(Sup, Chid){
Chid.prototype = Object.create(Sup.prototype); //作为函数或者类时的原型
Object.defineProperty(Chid,'constructor',{
value: Chid,
enumerable:false,
writable:true,
configurable:true
}); //构造函数
Chid.__proto__ = Sup; //作为对象的原型(构建原型链)
} var CustomError = function(_error){
Inherit(_error, CustomError);
function CustomError(){
var applyCustructor = (CustomError.__proto__ || Object.getPrototypeOf(CustomError)).call(this); //执行父级的构造函数
//父类构造函数有返回值,就有返回值,否则就用this
var _this = ( typeof applyCustructor == 'object' || typeof applyCustructor == 'function' ) ? applyCustructor : this;
_this.name = 'sdf';
return _this;
}
return CustomError;
}(Error); var _error = new CustomError();
throw _error;

重点理解:var applyCustructor = (CustomError.__proto__ || Object.getPrototypeOf(CustomError)).call(this);这句代码,表示执行CustomError原型上的构造函数(也就是Error),与var applyCustructor = Error.call(this);是等效的

ES6的派生类实现:

class CError extends Error{
constructor(){
super();
this.name = '子类';
}
}
var _e = new CError();

V8环境下运行的区别:

Javascript基本类型回顾的更多相关文章

  1. JavaScript事件类型

    JavaScript事件类型 Web浏览器中可能发生的事件有很多类型.这里我将主要将下面几种常用的事件类型: UI事件 焦点事件 鼠标与滚轮事件 键盘与文本事件 复合事件 变动事件 HTML5事件 设 ...

  2. Flow: JavaScript静态类型检查工具

    Flow: JavaScript静态类型检查工具 Flow是Facebook出品的,针对JavaScript的静态类型检查工具.其代码托管在github之上,并遵守BSD开源协议. 关于Flow 它可 ...

  3. javascript 操作符类型隐性转换

    javascript 操作符类型隐性转换 (一).一元操作符只能操作一个值的操作符叫做一元操作符1.递增和递减操作符a. 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减1的操作 ...

  4. javascript学习-类型判断

    javascript学习-类型判断 1.类型判断的的武器 javascript中用于类型判断的武器基本上有以下几种: 严格相等===,用来判断null,undefined,true,false这种有限 ...

  5. JavaScript的类型自动转换高级玩法JSFuck

    0 前言 最开始是不小心在微信公众号(程序员大咖)看到一篇JS的高逼格代码,然后通过里面的链接跳转到了JSFuck的wiki,就像顺着迷宫找宝藏的感觉,感叹JS的自动类型转换的牛逼. 1 样例 (!( ...

  6. 面向对象的JavaScript --- 动态类型语言

    面向对象的JavaScript --- 动态类型语言 动态类型语言与面向接口编程 JavaScript 没有提供传统面向对象语言中的类式继承,而是通过原型委托的方式来实现对象与对象之间的继承. Jav ...

  7. javascript 字典类型的使用

    javascript  字典类型的使用 1.使用Array: var arr = new Array(); arr["zs"] = "zhangsan"; ar ...

  8. javascript变量类型及作用域

    javascript变量类型及作用域 一.简介 变量类型 ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型. 基本类型 基本类型指的是简单的数据段,5种基本数据类型:undef ...

  9. js课程 1-3 Javascript变量类型详解

    js课程 1-3  Javascript变量类型详解 一.总结 一句话总结:js对象点(属性方法),json对象冒号(属性方法).属性和方法区别只有一个括号. 1.json对象中的函数的使用? 函数名 ...

随机推荐

  1. python程序入门 基础教程

    1.VSCode基础使用+VSCode调试python程序入门 2.pip 安装 3.scrapy安装 4.python解析xml

  2. 把网站打包快速在线生成ios app的正确方法

    下方的内容不用看了,请点这里 !点这里!IOS APP自助生成系统已上线,请马上去了解下: http://www.tao-jiujiu.com/post/188.html  ============= ...

  3. Java String类的intern()方法

    该方法的作用是把字符串加载到常量池中(jdk1.6常量池位于方法区,jdk1.7以后常量池位于堆) 在jdk1.6中,该方法把字符串的值复制到常量区,然后返回常量区里这个字符串的值: 在jdk1.7里 ...

  4. Network Security final project---War Game

    项目介绍: 为自己的网段设置防火墙并尝试攻击其他组 网络结构: 每组有3个机器,包含一个gateway和两个workstation,其中gateway是可以连接到其他组的gateway,但是无法连接到 ...

  5. pytroch nn.Module源码解析(1)

    今天在写一个分类网络时,要使用nn.Sequential中的一个模块,因为nn.Sequential中模块都没有名字,我一时竟无从下笔.于是决定写这篇博客梳理pytorch的nn.Module类,看完 ...

  6. 一. 优化小程序自身的Storage

    小程序中的存储只有 Storage ,特性如下: 上限为 10MB 以用户纬度隔离,同一个设备,A 无法访问 B 用户的数据. 持久缓存,只有在用户关掉小程序才会删除,如果空间不足,会进行 LRU , ...

  7. MyBatis(九) 使用association定义单个对象的封装规则

    (1)接口中编写方法 public Emp getEmpandDept(); (2)编写Mapper文件 <resultMap type="com.eu.bean.Emp" ...

  8. Tensor基本操作

    Tensor(张量) 1.Tensor,又名张量,从工程角度来说,可简单地认为它就是一个数组,且支持高效的科学计算.它可以是一个数(标量).一维数组(向量).二维数组(矩阵)或更高维的数组(高阶数组) ...

  9. vue 格式化银行卡(信用卡)每4位一个符号隔断

    问题 在做银行卡输入框时有一个需求如题,这里举例用-隔断 调查 查看了很多大公司网站的银行卡输入,发现还有有很多缺陷的: 有的是在中间删除,光标会跳到最后: 有的是能删除掉中间隔断符的: 等等,逻辑感 ...

  10. 多阶段构建Docker镜像

    在Docker 17.05及更高的版本中支持支持一种全新的构建镜像模式:多阶段构建: 多阶段构建Docker镜像的最大好处是使构建出来的镜像变得更小: 目前常见的两个构建镜像的方式为: 1.直接使用某 ...