一般构造函数定义和调用如下:

function Person(name,age,job)
{
   this.name=name;
   this.age=age;
   this.job=job; 
}
var person=new Person('thinksley',24,'web developer');
console.log(person.name); //thinksley

而如果实例化对象的时候不用new的话,this会映射到全局的window对象上,这时候person.name就会变成undefined了,要把对象改成window:

function Person(name,age,job)
{
   this.name=name;
   this.age=age;
   this.job=job; 
}
var person=Person('thinksley',24,'web developer');
console.log(window.name);//thinksley

console.log(person.name);//undefined

那么完整的构造函数可以用if判断来做了,如下

function Person(name,age,job)
{
  if(this instanceof Person)
  {
   this.name=name;
   this.age=age;
   this.job=job; 
  }
  else
  {
   return new Person(name,age,job); 
  }
}
var person=Person('thinksley',24,'web developer');
console.log(person.name);//thinksley

var person=new Person('thinksley',24,'web developer');
console.log(person.name); //thinskley

这样构造函数就确保了this是否是Person对象的实例,要么使用new操作符,要么在现有的person实例环境中调用构造函数。

转载于:https://www.cnblogs.com/thinksley/archive/2013/02/24/2924098.html

作用域安全的构造函数相关推荐

  1. 如何写一个作用域安全的构造函数

    基础部分 构造函数本质上就是一个使用new操作符调用的函数,使用new调用时,构造函数内用到的this对象会指向新创建的对象实例: function Girlfriend(name, age, hei ...

  2. Javascript作用域问题的构造函数的变量

    构造函数new对于使用.代表创建对象.此外,它可以被用作普通的函数调用,因为它也是一个功能. function Person(name) {this.name=name; }Person(12); a ...

  3. 由作用域安全的构造函数想到的

    PHP中定义的每一个变量对象,都是$GLOBALS的属性,因为PHP本身就是面向对象的,但是JavaScript的核心语法是面向过程的,ECMAScript 标准没有规定全局对象的类型,JavaScr ...

  4. 相学java_从这两套题,重新认识JS的this、作用域、闭包、对象

    日常开发中,我们经常用到this.例如用Jquery绑定事件时,this指向触发事件的DOM元素:编写Vue.React组件时,this指向组件本身.对于新手来说,常会用一种意会的感觉去判断this的 ...

  5. 《JavaScript忍者秘籍》(第二版)- 第5章 -精通函数:闭包和作用域

    目录 第5章 精通函数:闭包和作用域 5.1 理解闭包 5.2 使用闭包 5.2.1 封装私有变量 5.2.2 回调函数 5.3 通过执行上下文来跟踪代码 5.4 使用词法环境跟踪变量的作用域 5.4 ...

  6. 《JavaScript面向对象精要》读书笔记

    JavaScript(ES5)的面向对象精要 标签: JavaScript 面向对象 读书笔记 2016年1月16日-17日两天看完了<JavaScript面向对象精要>(参加异步社区的活 ...

  7. js 设计模式与继承学习

    设计模式 创建自定义对象的最简单方式是new 一个object对象,然后给它添加方法与属性 如: 1 var person = new Object(); 2 person.name = " ...

  8. 前端红宝书《JavaScript高级程序设计》核心知识总结

    此文是对<JavaScript 高级程序设计>一书难点的总结,也是笔者在看了 3 遍之后的一些梳理和感想,希望能借此巩固js的基础和对一些核心概念有更深入的了解. 摘要 JS基本的数据类型 ...

  9. 《JavaScript高级程序设计》(第2版)上市

      本书是技术畅销书<JavaScript高级程序设计> 的第2版,几乎全部更新.重写 了上一版的内容,融入了作者近几年来奋战在前端开发一线的宝贵经验 , 是学习和提高JavaScript ...

最新文章

  1. 你会不会用mysql查询近7个月的数据?没有记录默认为空
  2. Spring 注解配置
  3. 计算机硬件系统设计mooc,计算机硬件系统设计MOOC答案
  4. XP+UBUNTU双系统上重装XP后修复GRUB方法
  5. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)
  6. UVa11292 - Dragon of Loowater (贪心+模拟)
  7. Simulink之变压器漏抗对整流电路的影响
  8. 网站程序 Bin目录下 dll无法删除,删除并编译后自动重新引用的解决方法
  9.  paip.android环境搭建与开发事例
  10. c语言题目关于欧姆定律,电压_电流_电阻_欧姆定律计算含答案.doc
  11. w7计算机文件夹打开怎么设置密码,win7电脑文件夹怎么设置密码
  12. eNSP实验三:OSPF路由协议
  13. 中医针灸学综合练习题库【5】
  14. bzoj1720[Usaco2006 Jan]Corral the Cows 奶牛围栏
  15. 为什么下载那种小电影时,经常会卡在99%?
  16. 基于Springboot实现在线学习管理平台
  17. 50页智慧校园解决方案[附下载]
  18. 计算机是人类文化发展的第几个里程碑,人类已经无法阻止!人工智能的十个重要里程碑...
  19. IPETRONIK活塞式发动机试验方案
  20. 用lua 实现一个 nginx 负载均衡

热门文章

  1. 详解SOA五种基本架构模式
  2. golang自定义路由器设计
  3. go使用beedb库进行ORM开发
  4. redis单线程架构
  5. 搭建kubernetes DashBoard
  6. 索引中丢失IN或OUT
  7. scipy的一些函数名
  8. 记一次与用户的亲密接触
  9. firefox和chrome中 JQuery的ajax组件执行差异
  10. R有序因子和无序因子(4)