新的篇章开始了,本章开始,所有的内容都是十分有价值和意义的。本章主要的内容包括对象字面量、构造函数、数组字面量、正则字面量、基本值类型字面量以及JSON等。在大家的工作和实际应用中也有一定的指导意义。

一、对象字面量

  我们直接来先看一下代码:

// 开始时定义一个空对象
var dog = {}; // 向dog对象添加一个属性
dog.name = "Benji"; // 现在,向dog对象添加一个方法
dog.getName = function() {
return dog.name;
}; // 前面的例子中,dog对象开始是干净的状态,即一个空对象(这里的空对象是指除了继承以外的属性,并没有自身的属性)。
// 然后可以向该对象添加一个属性和一个方法。在程序生命周期的任何时候,都可以执行以下操作。 // 改变属性和方法的值:
dog.getName = function() {
// 重新定义返回该方法
// 返回一个硬编码的值
return "Fido";
}; // 完全删除属性/方法:
delete dog.name; // 添加更多的属性和方法:
dog.say = function () {
return "Woof!";
}; dog.fleas = true;

  当然,并不要求必须从空对象开始。对象字面量模式可以使您在创建对象时向其添加函数:

var dog = {
name:"Benji",
getName:function() {
return this.name;
}
};

  ok,上面的例子,就是一个标准的对象字面量写法,对象字面量语法如下:

    1、将对象包装在打括号中。

    2、对象中以逗号分隔属性和方法。在最后的名称-值的尾随逗号是允许的,但是在一些特殊的浏览器下会报错,所以请尽量不要这样。

    3、用冒号来分隔属性的名称和属性的值。

    4、当给变量赋值时,请不要忘记右大括号“}”后的分号。

来自构造函数的对象

  我们先来看一下,如何创建一个对象:

// 第一种方法:使用字面量:
var car = {goes:'far'}; // 另一种方法:使用内置构造函数-这是一个反模式,不要应用!
var car = new Object();
car.goes = "far";

  上面的两种创建对象的方式,尤其注意,不要使用内置构造函数来创建对象。字面量表示发的显著优点在于它仅需要输入更短的字符。优先选择字面量模式创建对象的另一个原因在于:它强调了该对象仅仅是一个可变哈希映射,而不是从对象中提取的属性或方法。

  与使用object构造函数相对,使用字面量的另一个原因在于它并没有作用域解析。因为可能以同样的名字创建了一个局部构造函数,解释器需要从调用Object()的位置开始一直向上查询作用域链,而不是从对象中提取的属性或方法。

对象构造函数捕捉

  我们不会使用对象构造函数去创建对象,但是我们应该了解对象构造函数的“特征”。这里的涉及到的“特征”在于,Object()构造函数仅接受一个参数,并且还依赖传递的值,该Object()可能会委派另一个内置构造函数来创建对象,并且返回了一个并非期望的不同对象。

// 以下是反模式

// 一个空对象
var o = new Object();
console.log(o.constructor === Object); //true // 一个数值对象
var o = new Object(1);
console.log(o.constructor === Number); //true
console.log(o.toFixed(2)); //"1.00" // 一个字符串对象
var o = new Object('I am a String');
console.log(o.constructor === String);// true // 一般的对象并没有substring()方法
// 但是字符串对象都有该方法
console.log(typeof o.substring); // "function" // 一个布尔对象
var o = new Object(true);
console.log(o.constructor === Boolean); //true

  我们看上面的代码,将数字、字符串、布尔值传递到new Object()构造函数中,其结果是获得了不同构造函数所创建的对象。就拿最后一个创建一个Boolean对象来说,实际上,真正执行创建的内置构造函数并不是Object(),而是Object()委派Boolean()构造函数创建的。

  当传递给Object()构造函数的值是动态的,并且直到运行时才能确定其类型时,Object()构造函数的这种行为可能会导致意料不到的结果。因为,最后再强调一遍,不要使用new Object()构造函数!

二、自定义构造函数

    除了对象字面量模式和内置的构造函数以外,可以使用自己的构造函数来创建对象:

var adam = new Person("Adam");
adam.say();

  这里的Person,只是一个函数而已:

var Person = function(name) {
this.name = name;
this.say = function () {
return "I am" + this.name;
};
};

  当使用new操作符调用构造函数时,函数内部会发生以下情况:

    1、创建一个空对象并且this变量引用了该对象,同时还继承了该函数的原型。

    2、属性和方法对加入到this引用的对象中。

    3、新创建的对象由this所引用,并且最后隐式的返回this(如果没有显示的返回其它对象)。

  看起来就像这样:

var Person = function(name) {
// 使用对象字面量模式创建一个新对象
// var this = {};
// 向this添加属性和方法
this.name = name;
this.say = function () {
return "I am" + this.name;
}; // return this;
};

  在上面的例子中,为了简单起见,将say()方法添加到了this中。其造成的结果是在任何时候调用new Person()时都会在内存中创建一个新的函数。这种方法的效率显然非常低下,因为多个实例之间的say()方法实际上并没有改变,更好的选择是将方法添加到Person类的原型中。

Person.prototype.say = function () {
return "I am" + this.name
}

  这里要强调的一点事,可重用的成员,比如可重用的方法,都应该放置到对象的原型中。

  要注意:

// var this = {};

  这段代码并不是真相的全部。因为“空”对象实际上并不空,它已经从Person的原型的原型中继承了许多成员。因此,它更像是下面的语句:

//var this = Object.create(Person.prototype);

  Object.create会在后续的内容中进一步讨论。

构造函数的返回值

  当使用new操作符创建对象时,构造函数总是返回一个对象;默认情况下返回的是this所引用的对象。如果在构造函数中并不向this添加任何属性,将返回“空”对象(这里的空,指的是除了从构造函数的原型中所继承的成员以外)。

  构造函数将隐式返回this,甚至于在函数中没有现实的加入return语句。但是,可以根据需要返回任意其他对象。比如:

var Objectmaker = function () {
// 下面的“name”属性将被忽略
// 这是因为构造函数决定改为返回另一个对象
this.name = "This is it";
// 创建并返回一个新对象
var that = {};
that.name = "And that's that";
return that;
}
// 测试
var o = new Objectmaker();
console.log(o.name);

  正如上面所看到的,可以在构造函数中自由的返回任意对象,只要它是一个对象。试图返回并非对象的值,这虽然不会造成错误,但是函数却会简单的忽略该值,相反,构造函数将会返回this所引用的对象。

  好了,我们今天的内容就先到这里。后面再继续,以防一篇的文章内容过长。

《JavaScript 模式》读书笔记(3)— 字面量和构造函数1的更多相关文章

  1. JavaScript模式读书笔记 文章3章 文字和构造

    1.对象字面量     -1.Javascript中所创建的自己定义对象在任务时候都是可变的.能够从一个空对象開始,依据须要添加函数.对象字面量模式能够使我们在创建对象的时候向其加入函数.       ...

  2. JavaScript模式读书笔记 第4章 函数

    2014年11月10日 1.JavaScript函数具有两个特点: 函数是第一类对象    函数能够提供作用域         函数即对象,表现为:         -1,函数能够在执行时动态创建,也 ...

  3. JavaScript 模式》读书笔记(3)— 字面量和构造函数3

    这是字面量和构造函数的最后一篇内容,其中包括了JSON.正则表达式字面量,基本值类型包装器等知识点.也是十分重要的哦. 五.JSON JSON是指JavaScript对象表示以及数据传输格式.它是一种 ...

  4. 《JavaScript模式》第3章 字面量和构造函数

    @by Ruth92(转载请注明出处) 第3章:字面量和构造函数 一.创建对象的三种方式 // 对象字面量 var car = {goes: "far"}; // 内置构造函数(反 ...

  5. 《Javascript模式》之对象创建模式读书笔记

    引言: 在javascript中创建对象是很容易的,可以使用对象字面量或者构造函数或者object.creat.在接下来的介绍中,我们将越过这些方法去寻求一些其他的对象创建模式. 我们知道js是一种简 ...

  6. 《javascript模式--by Stoyan Stefanov》书摘--字面量和构造函数

    二.字面量和构造函数 1,能够使用对象字面量时,就没理由使用new Object构造函数 // 一个空对象var 0 = new Object();console.log( o.constructor ...

  7. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  8. 《你不知道的javascript》读书笔记2

    概述 放假读完了<你不知道的javascript>上篇,学到了很多东西,记录下来,供以后开发时参考,相信对其他人也有用. 这篇笔记是这本书的下半部分,上半部分请见<你不知道的java ...

  9. JavaScript 模式》读书笔记(3)— 字面量和构造函数2

    上一篇啊,我们聊了聊字面量对象和自定义构造函数.这一篇,我们继续,来聊聊new和数组字面量. 三.强制使用new的模式 要知道,构造函数,只是一个普通的函数,只不过它却是以new的方式调用.如果在调用 ...

随机推荐

  1. Apache虚拟机的配置文件解说

    1.为了方便管理虚拟主机,我决定使用一种方法,那就是修改httpd-vhosts.conf文件. 第一步首先要使扩展文件httpd-vhosts.conf生效: 1. 打开 apache/conf/h ...

  2. nginx: [emerg] unknown directive “ ” in /usr/local/nginx/conf/vhost/XXX.conf:53报错处理

    开发同事发给我一小段nginx配置,加到服务器上之后,执行nginx -s reload时,出现报错: nginx: [emerg] unknown directive “ ” in /usr/loc ...

  3. loadrunner没有告诉你的

    1.        LoadRunner之-Block l  如何在一个脚本中实现不同事务不同次数的循环呢? l  案例:假如你想在一个脚本中,实现登录执行1次,查询执行2次,插入执行3次,怎么办?录 ...

  4. 解密JDK8 枚举

    写一个枚举类 1 2 3 4 5 6 public enum Season { SPRING, SUMMER, AUTUMN, WINTER } 然后我们使用javac编译上面的类,得到class文件 ...

  5. 从租人APP沦为性工作发布平台 看共享经济监管边界

    看共享经济监管边界" title="从租人APP沦为性工作发布平台 看共享经济监管边界"> 继直播类软件部分涉黄之后,最近火爆的各类"租人"软件 ...

  6. 微软发布Microsoft Concept Graph和Microsoft Concept Tagging模型

    ​ Concept Graph和Microsoft Concept Tagging模型"> 当我们在讨论人工智能时,请注意,我们通常在讨论弱人工智能. 虽然我们现有的资源与之前可谓不同 ...

  7. 【读书笔记】https://source.android.google.cn/compatibility/tests?hl=en

    AuthorBlog:秋城https://www.cnblogs.com/houser0323/ Android Platform Testing This content is geared tow ...

  8. 零基础JavaScript编码(二)

    任务目的 在上一任务基础上继续JavaScript的体验 学习JavaScript中的if判断语法,for循环语法 学习JavaScript中的数组对象 学习如何读取.处理数据,并动态创建.修改DOM ...

  9. JZOJ 5326. LCA 的统计 (Standard IO)

    5326. LCA 的统计 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description Input Output S ...

  10. Linux——如何将Red Hat Enterprise Linux 6的语言改为中文?

    第一步,打开终端,输入su -,获取超级用户权限,输入密码. 第二步,输入cd /etc/sysconfig,进入设置目录. 第三步,输入vi i18n,进入到配置文件. 第四步,按 ‘i’键,进入编 ...