红宝石读书笔记--5.1

继昨天的chapter5

1、基本包装类型(为了便于操作基本类型值)基本类型不是对象,因而从逻辑上讲它们不应该拥有方法,但是为了能够更加地直观地操作,操作更加方便后台自动完成了一系列地处理。

例如:在读取模式中访问字符串的时候,后台都会自动完成下列的一系列处理:1、创建string类型实例。2、在实例上调用指定的方法。3、销毁这个实例。

也就是说自动创建的基本包装类型的对象只存在于一行代码地执行瞬间,然后立即被销毁!。不能在运行时为基本类型值添加属性和方法。

当然也可以显式地调用new来创建基本包类型的对象。(不过应该在绝对必要的情况下再这样做)

Boolean:所有对象表达式->true;typeof返回值为object;利用instanceof Boolean测试基本对象会返回false,测试boolean对象才会返回true;

Number类型:toString(参数可设置几进制);toFixed(参数可以设置小数位数);toExponential(参数可以设置输出的小数位数)(利用指数方式);toPrecision(参数表示数的位数);;;其typtof()和instanceof()于Boolean原理一样;

String类型:继承地方法:valueOf(),toLocalString(),toString()字符方法:charAt()和charCodeAt();字符串操作方法:concat(),slice(),substring(起始位置,末尾位置(不包括末尾)),substr(起始位置,结束位置) ;字符串位置方法:indexof(),lastindexof();trim()方法,返回字符串副本;toLowerCase()、toLocalLowerCase()、toUpperCase()、toLocalUpperCase()返回值均为一个新的字符串,当不知道代码在哪种语言环境中运行的情况下,还是使用针对地方的方法更稳妥一些 。   ;模式匹配的方法: match()只接受一个参数,要么是正则表达式,要么是RegExp对象,另一个查找模式的方法是search(),返回值如果找到则为第一个匹配项的索引,如果没有找到,则返回-1;replace(,)第一个参数如果是字符串那么则只会替代第一个子字符串,如果需要全部替代,那么需要提供正则表达式并且提供全局标志。第二个参数是字符串,当然也可以使用一些特殊的字符序列,P127 对第二个参数也可以是一个函数。正则表达式生成图像地址https://regexper.com。  split方法()参数1为需要分割地符号,2,为截短所用。   ; localCompare()该方法比较两个字符串,字典序比较,参数接收一个字符串,如果它在字符串参数之前,那么返回正数(一般为1);  String构造函数还有一个静态方法,fromCharCode()接收一或多个字符编码,将它们转换成一个字符串。

2、单体内置对象

Global对象:URI编码方法:encodeURI()(主要用于整个URI,不会对URI本身地特殊字符进行编码)和encodeURIComponent(主要用于URI地某一段,会对它发现的任何非标准字符进行编码)当然decodeURI()和decodeURIComponent()只能解码相应的函数;    eval()就像是一个完整的JavaScript解析器,只接受一个参数,即要执行的JavaScript字符串。eval()中  创建的任何变量和函数都不会被提升,因为再解析代码的时候,他们被包含在一个字符串中,只有再eval()执行的时候创建     (在处理用户输入数据的情况下可能会有代码注入的风险)。P133Global对象的属性。;   Web浏览器都是将这个全局对象作为window对象的一部分加以实现的,因此再全局作用域中声明的所有变量和函数就都成为了window对象的属性。另一种取得Global对象的方法是通过this。

Math对象P134对象属性,方法:max(),min(),Math.max.applu(Math,values)这个技巧的关键。;舍入方法 Math.ceil(),Math.floor(),Math.round(). ;   random()方法。;   当然还有很多其他使用方法。P136

chapter6 面向对象的程序设计

1、理解对象

每个对象都是基于一个引用类型创建的。

上一章曾经讲过创建自定义对象最简单的方法就是创建一个Object实例,然后再为它们添上属性和方法。后来呢,字面量创建成为创建这种对象的首选项:

属性类型:ECMA-262第五版在定义只有内部才用的特征时,藐视了属性的各种特征。这些特征是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。为了表示特征是内部值,该规范把它们放在了两对方括号中。es中有两种属性:数据属性和访问其属性。

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。有四个描述行为的特性:[[Configurable]]、[[Enumerable]]、[[Writable]]、[[Value]]  默认值分别为true、true、true、undefined。          如果要修改属性默认的特性,必须使用es5中Object.defineProperty(属性所在的对象,属性的名字,一个描述符对象)


注意:可以多次调用Object.defineProperty()方法修改同一个属性,但是当把configurable特性设置为false之后就会有限制了。在调用Object.defineProperty()方法创建一个新属性时,如果不指定,configurable、enumerable、writable特性的默认值都是false。如果调用Object.defineProperty()方法只是修改已定义的属性特性,则无此限制。


访问器属性:访问器属性不包含数据值,读:getter函数。写:setter函数。   访问器属性有如下4个特性:[[configurable]]、[[Enumerable]]、[[Get]]、[[Set]]。    访问器属性不能直接定义,必须使用Object.defineProperty()来定义:


不一定要同时指定getter和setter。但是不指定setter不可写,不指定getter读为(undefined)(严格模式下抛出错误)。


定义多个属性Object。defineProperties(要添加和修改属性的对象,对象的属性于第一个对象要添加或修改的一一对应)


与上一节唯一的区别就是这里的属性都是在同一时间创建的。


读取属性的特性:Object.getOwnPropertyDescriptor(属性所在的对象,要读取其描述符的属性名称)返回值是一个对象;


2、创建对象

虽然Object构造函数或对相关字面量都可以用来创建单个对象,但这些方式有个明显的缺点,使用同一个接口创建很多对象的,会产生大量重复的代码;

工厂模式:用函数来封装以特定接口创建对象的细节。

构造函数模式:可以创建自定义的构造函数。


不同之处:没有显式地创建对象;直接将属性和方法赋给了this对象;没有return语句。   按照管理,构造函数名使用大写字母开头。


new操作符,调用构造函数实际上会经历一下4个步骤:创建一个新对象;将构造函数的作用域赋给新对象(因此this就指向了这个新对象);执行构造函数中的代码(为这个新对象添加属性);返回新对象。

检测对象类型还是用instanceof操作符更加可靠。person1既是Person的属性,也同时是Object的属性。

构造函数和其他的函数的唯一区别,就在于调用它们的方式不同。如果构造函数没有用new,则属性和方法全部都添加给window对象。因为在全局作用域中调用一个函数时,this对象总是指向Global对象(浏览器中为window)。


但是对于上述的构造函数,每个实例对象也都有各自的Function实例在里面,但是的确没有太大的必要。于是移可讲sayName函数的定义放在构造函数的外部。而在构造函数内部我们将sayName属性指向全局函数。       但是!!存在的问题:如果对象需要定义更多的方法就要定义很多个全局函数,毫无封装性可言;全局作用域中定义的对象实际上只能被某个对象调用,这让全局作用域有点名不副实。!

以上问题都可以用原型模式来解决

原型模式:每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。为对象实例的原型对象。 使用原型对象的好处就是:可以让所有对象实例共享它所包含的属性和方法。(妈耶这个知识点太多我得重新写一篇!!)

猜你喜欢

转载自blog.csdn.net/m_oman/article/details/80155218
今日推荐