创建对象的安全模式

对于有些JavaScript的初学者来说,可能不太适应面向对象的写法,经常容易忘记使用new关键字而导致出错。

其实,我们可以找为检察官为我们实时监测。

首先,我们来看下问题所在吧!

function Person(name, age) {
    this.name = name;
    this.age  = age;
}
var person = Person(‘aa‘, 20);
console.log(person.name); // TypeError 

原因不难看出吧,Person是在作为一个函数在全局环境执行了,那么this必然指向全局的对象,这里为window,

即window.name为aa,window.age为20,但person对象是没有的!

如何避免这种错误呢?我们可以使用创建对象的安全模式,首先监测是否为当前类的示例,

是的话说明使用了new关键字,正常执行就是了,否则返回一个示例对象,再次为this进行赋值操作,如下:

function Person(name, age) {
    if (this instanceof Person) {
        this.name = name;
        this.age  = age;
    }
    else {
        return new Person(name, age);
    }
}
var person = Person(‘aa‘, 20);
console.log(person.name); // aa 正常输出
时间: 2024-10-07 10:24:10

创建对象的安全模式的相关文章

js 设计模式 oop 面向对象编程

最初我们写js代码的时候是这么写 function checkName(){ //验证姓名 } function checkEmail(){ //验证邮箱 } function checkPassword(){ //验证密码 } 这种方式会造成全局变量的严重污染,再过渡到 var checkObject = { checkName : function(){}; checkEmail: function(){}; checkPassword: funcion(){}; } //也可如此写 var

javascript设计模式系列二-封装

JavaScript封装: var Book = function (id, name, price) { this.id = id, this.name = name, this.price = price } Book.prototype.display = function () { //展示书本 } var book = new Book(10, 'js', 30); book.display(); console.log(book.name); 问题:通过this和prototype添

Asp.Net 之 通过调用 WScript.Shell 启动本地 exe 程序时产生“ automation服务器不能创建对象 ”的错误

我们经常需要通过生成 ActiveXObject("WScript.Shell"); 来调用某一exe文件. 设置网页打印的页眉页脚为空: var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER"; HKEY_Path="//software//Microsoft//Internet Explorer\\PageSetup\\"; function PageSetup_Null

调用WScript.Shell时产生Automation 服务器不能创建对象的错误

我们经常需要通过生成ActiveXObject("WScript.Shell");来调某一exe文件, 如 //设置网页打印的页眉页脚为空 var HKEY_Root,HKEY_Path,HKEY_Key;         HKEY_Root="HKEY_CURRENT_USER";         HKEY_Path="//software//Microsoft//Internet Explorer\\PageSetup\\";      fu

如何封装UILable 输入框 和UIField 显示框 同时创建对象(经典)

源代码(.m文件) #import "TLView.h" //本类的延展 @interface TLView () { UILabel *_desLabel;    //左边的lable UITextField *_textField;//右边的lable } @end @implementation TLView //改写父类的初始化方法,处理相同的性能 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:f

Automation服务器不能创建对象

来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=238GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com Automation服务器不能创建对象 的多种解决办法 方法一:开始-运行:regsvr32 scrrun.dll 方法二:请将以下语句复制到记事本中,另存为后缀为.cmd的文件,并运行.当然在命令行下一句句运行也没问题.echo 正在修复,这个过程可能需要几分钟,请稍候--run

javascript之创建对象

面向对象(Object-Oriented,OO)的语言有一个特点,那就是它们都有类的概念.而javascript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或函数",我们可以把对象想象成散列集:无非就是一组名值对,其中值可以是数据或函数.下面介绍几种创建对象的按方法. 一.Object构造函数或对象字面量 var person={ name:"Bob", age:"

js中对象 类 实例的区别 数据类型 创建对象

类是对象的具体细分,实例是类中的一个具体事物. 基本数据类型和 引用数据类型 基本数据类型:numble string undefined null 引用数据类型:对象和函数 对象数据类型又细分为:对象类(object)数组类(array)正则类(reg..) 基本数据类型的特点:按照值来操作 引用数据类型的特点:先开一个空间,浏览器为其分配一个地址,接着把内容存到空间中,最后把地址赋给变量. ========================================== 创建对象的方式

java中创建对象的方法

有4种显式地创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法. 3.调用对象的clone()方法. 4.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法. 下面演示了用前面3种方式创建对象的过程. [java] view plain copy public cla