们可以通过构造器函数(简称构造函数)来创建对象:

function Her(){
    this.child = 'Jon';
}

为了使用该函数来创建对象,我们需要使用new操作符,例如:

var she = new Hew();
she.child; // Jon

使用构造函数创建对象的好处就是她可以接受一些参数,下面我们就来修改一下上面的例子:

function Her(name){
    this.name = name;
    this.child = 'Jon;
    this.whoAreYou = function(){
        return 'I am' + this.name + 'My child is' + this.child;
    }
}

现在,我们就能利用同一个构造函数创建不同的对象了:

var her1 = new Her('A');
var her2 = new Her('B');

按照惯例,我们应该将构造函数的首字母大写,以便区分一般函数。

如果我们在调用一个构造函数的时候忽略了new操作符,尽管代码不会出错但她的运行结果往往会出人意料!

var a = Her('A');
console.log(typeof a);  // undefined

由于我们没有使用new操作符,那我们就不是在创建一个新的对象。这个函数调用与其它函数并没有神马区别,这里的a就应该是函数的返回值,由于Her()函数没有显式的返回值(return关键字返回),所以说便隐式的返回了undefined,并将该值赋给了a。

那么这时候的this指向的是谁呢?答案是window.

当我们创造对象的时候,实际上同时也赋予了该对象的一种特殊的属性---即构造器属性(constructor prototype)。该属性实际上是一个指向用于创建该对象的构造器函数的引用。

function Her(){
   this.name = 'Anna';
}
var she = new Her();
cosole.log(she.constructor);
// function Her(){
//    this.name = 'Anna';
//}

当然,由于构造器函数引用的是一个函数,因此我们可以利用她来创建另一个新对象:

var her2 = new Her.constructor()

大意就是:‘无论对象her2有没有被创建,我们都可以用她来创建另一个对象’。

另外,如果对象是通过‘{}’这种方式被创建的,那么实际上她就是由内建函数Object()函数所创建的:

var o = {};
console.log(o.constructor);
//function Object(){}
console.log(typeof o.constructor)
// function

instanceof 操作符

可以测试某个对象是不是由某个指定的构造函数创建的。

function Hero(){};
var h = new hero();
var o = {};
cosole.log(h instanceof Hero) //true

请注意,这里的函数名Hero后面没有加(),因为这是函数的引用而不是调用。

javascript对象初探(一)--- 构造器函数的更多相关文章

  1. javascript 对象初探 (四)--- 内建对象之旅之Array

     我们不要去纠结神马是内建对象,神马是內建构造器.到后来你们便会发现其实她们都是对象. Array()是一个构建数组的內建构造器函数: var arr = new Array(); 与下面的是等效的: ...

  2. javascript 对象初探 (三)--- 传递/比较对象

    传递对象 当我们拷贝某个对象或者将对象传递给某个函数时,往往传递的都是该对象的引用.因此我们在该对象的引用上做任何改动,实际上都会影响到引用的原对象. var she = {num:1}; var h ...

  3. javascript 对象初探(二)--- 返回对象的函数

    除了使用new操作符调用构造函数以外,我们也可以抛开new操作符,只用一般函数来创建对象,这样就能执行某些预备工作,并已对象为返回值的函数.. function her(){ return { nam ...

  4. javascript对象初探 (五)--- 函数对象的属性

    与其他对象相同的是,函数对象中也有一个叫做constructor的属性,其引用就是Function()这个构造函数. function her(a){ return a; } console.log( ...

  5. javascript 对象初探 (六)--- call()和apply()初探

    在javascript中,每个函数都具有call()和apply()两个方法,您可以用她们来触发函数,并指定相关的调用参数. 此外,这两个方法还有另一个功能,就是她可以让一个对象去‘借用‘另一个对象的 ...

  6. javascript 对象初探 (四)--- 内建对象之旅之Boolean

    var a = new Boolean() 我们要明白一点在这里的b是一个对象而不是一个基本数据类型的布尔值.如果想将b转化成基本数据类型的布尔值,我们可以调用她的valueof()方法(继承自Obj ...

  7. 24 JavaScript对象访问器&JavaScript对象构造器

    ES5引入了Getter和Setter Getter和Setter允许定义对象访问器 JavaScript Getter(get关键字):获取对象属性 <script> var perso ...

  8. javascript——对象的概念——创建对象与销毁对象

    一.创建对象 1.创建空对象 方式一: var o ={};o; //Object {} typeof(o); //"object" 方式二: var o=new Object() ...

  9. 在 JavaScript 中使用构造器函数模拟类

    今天,我们要讲的是在 JavaScript 中使用构造器函数(construcor function)模拟类. 构造器函数简介 你可以使用 ES6 的 class 关键字来实现类,不过我建议你使用传统 ...

随机推荐

  1. LoRaWAN协议(六)--OTAA KEY生成过程

    前言 通过OTAA方式入网的设备,通讯时使用的KEY需要通过服务器获得,在入网之间,设备无法通讯. 相关的OTAA入网流程已经在上一章中讲解过了,有兴趣的可以去看看**LoRaWAN协议(五)__OT ...

  2. Spring MVC 学习总结(五)——校验与文件上传

    Spring MVC不仅是在架构上改变了项目,使代码变得可复用.可维护与可扩展,其实在功能上也加强了不少. 验证与文件上传是许多项目中不可缺少的一部分.在项目中验证非常重要,首先是安全性考虑,如防止注 ...

  3. Sybase 数据库新增用户,赋权

    Sybase数据库, 需求:新增用户user1,赋予对原数据库中表t_jingyu的查询权限 数据库原用户登陆 isql -U用户 -P密码 -S服务名 sp_addlogin 'user1','us ...

  4. Cordova webapp实战开发:(4)Android环境搭建

    在<Cordova webapp实战开发:(3)后面可能会学到的东西>中我们说了一下后续大致包括的内容,今天我们继续.上周我在掌中广材集成了友盟的社交分享,今天想集成iOS应该很顺利的,但 ...

  5. C语言打印记事本内搜索字符串所在行信息

    本程序采用C语言编写,使用方法: 1.双击“甲骨文字符串查询作品.exe”运行程序; 2.运行前请确保此可执行程序目录下有1.txt文件. 3.根据提示输入一个字符串,程序将显示存在所搜索字符串的所有 ...

  6. (翻译)编写属于你的jQuery插件

    Writing Your Own jQuery Plugins 原文地址:http://blog.teamtreehouse.com/writing-your-own-jquery-plugins j ...

  7. SQL Server安全(2/11):身份验证(Authentication)

    在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...

  8. JAVA - 多线程 两种方法的比较

    一.继承Thread类 实现方法: (1).首先定义一个类去继承Thread父类,重写父类中的run()方法.在run()方法中加入具体的任务代码或处理逻辑.(2).直接创建一个ThreadDemo2 ...

  9. 127.0.0.1\SQLEXPRESS连接异常

    当你的数据库为SQLEXPRESS时,在程序的数据库连接字符串的服务Server使用127.0.0.1\SQLEXPRESS时,如下: 它会显示一异常: Server Error in '/' App ...

  10. Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)

    很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...