`
zhouyrt
  • 浏览: 1172603 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript中使用构造器创建对象无需new的情况

 
阅读更多

JS中创建对象可以直接使用直接量的方式,这里讨论的是定义一个构造器(function)的情况。如下

 

function Person(name, age) {
	this.name = name;
	this.age = age;
}
var p = new Person('lily', 20);

 

发现某些库代码中创建正则对象的方式无需new,这让人感到奇怪。如下

 

var reg = RegExp('^he$');

 

 测试发现使用或不使用new,最后返回的都是正则对象,且typeof它们都是“object”。

 

var reg1 = new RegExp('^he$');
var reg2 = RegExp('^he$');
reg1.test('he'); // true
reg2.test('he'); // true
console.log(typeof reg1); // object
console.log(typeof reg2); // object

 

嗯,挺好,代码运行正常。
如果这样的话干脆就不写new了,这么还节省了代码量。其它类型也是这样吗?试试String/Number/Boolean。

 

var str1 = new String(1);
var str2 = String(1);
var num1 = new Number('1');
var num2 = Number('1');
var boo1 = new Boolean(1);
var boo2 = Boolean(1);
console.log(typeof str1); // object
console.log(typeof str2); // string
console.log(typeof num1); // object
console.log(typeof num2); // number
console.log(typeof boo1); // object
console.log(typeof boo2); // boolean

 

可以看到,与正则的情况不同。正则无论是否new,typeof后都是object。
但String/Number/Boolean类型,new的对象typeof返回是“object”,不new的typeof返回则是“string”。

即不适用new的情况可以将其它类型分别转化成字符串,数字和布尔类型。

好了,再回到篇头的那个Person类。即我们自己写的类可以不用new操作符生成对象吗?

 

function Person(name, age) {
	this.name = name;
	this.age = age;
}
var p = Person('lily', 20);
console.log(p); // undefined

 返回undefined,很明显不行。因此想不用new的情况去创建Person实例是异想天开的。

如果非要实现呢?其实也行,如下

 

function Person(name, age) {
	this.name = name;
	this.age = age;
	if (this===window) {
		return new Person(name, age);
	}
}
var p = Person('lily', 20); // object
 

 

 稍微改造了下Person类。实际上内部区分了下Person是作为构造器还是函数执行。


相关:

使用隐藏的new来创建对象
JavaScript中判断函数是new还是()调用

分享到:
评论

相关推荐

    JavaScript中使用构造器创建对象无需new的情况说明

    然而,在一些特定的场景下,创建对象时可以不使用new操作符,这一点在某些库代码或者特定的内置对象构造器中可以观察到。通过分析这些情况,我们可以对JavaScript中构造器函数的使用有更深刻的理解。 首先,需要...

    javascript本地对象_内置对象和宿主对象

    创建对象通常有两种方式:使用`new`关键字和构造函数,例如`var o = new Object();`,或者使用对象字面量语法,如`var o = {};`。 当不再需要一个对象时,可以通过将它的引用设置为`null`来“废除”或解除对象,...

    JavaScript语言与Ajax应用JavaScript面向对象编程.pptx

    - 构造函数方式:定义一个函数作为构造器,使用new关键字创建实例。 ```javascript function Person(name, age) { this.name = name; this.age = age; } var john = new Person('John', 30); ``` - 原型链方式:...

    Javascript 对象

    2. **构造函数**:使用函数作为构造器,通过`new`关键字创建对象实例。构造函数通常使用首字母大写的命名约定,以区分于普通函数。 ```javascript function Person(name, age) { this.name = name; this.age = ...

    前端设计模式大全,包括工厂模式,原型模式,构造器模式等

    构造器模式类似于面向对象编程中的构造函数,用于初始化新创建对象的状态。在JavaScript中,构造函数是用来创建特定类型对象的函数,通过`new`关键字调用。不过,构造器模式并不局限于JavaScript,其他语言如...

    pro javascript design patterns

    在JavaScript中,通常通过闭包或构造函数结合私有化构造函数的方式实现。例如,使用闭包: ```javascript const Singleton = (function() { let instance; function createInstance() { return { singletonValue...

    JavaScript编程设计模式之构造器模式实例分析

    现在,所有通过`Car`构造器创建的实例都可以共享`toString`方法,而不会为每个实例创建新的副本。 此外,JavaScript提供了多种创建和操作对象的方式。例如,可以使用对象字面量创建空对象,或者使用`Object.create`...

    使用面向对象的技术创建高级-web-应用程序---毕业论文设计外文文献翻译.doc

    此外,JavaScript 1.5引入了构造函数和`new`操作符,进一步增强了面向对象的编程体验,允许开发者定义自己的类并创建实例。 在构建高级Web应用程序时,面向对象技术能够帮助组织代码,提高代码复用性和可维护性。...

    javascript操作

    面向对象编程通常依赖于类来创建对象实例,但在JavaScript中,我们可以通过函数来模拟类的行为。函数作为构造函数时,可以使用new关键字创建新对象,同时函数内部的this关键字会指向新创建的对象。通过原型链,对象...

    javascript基础-->中级-->高级-->面向对象

    1. 构造函数与new操作符:构造函数用于创建特定类型的对象,new操作符则是调用构造函数的手段。 2. prototype与__proto__:两者都与原型链有关,prototype是构造函数的属性,__proto__是实例对象的属性,它们连接了...

    JavaScript.Design.Patterns

    2. **工厂模式**:创建对象时,不直接使用new关键字,而是通过一个工厂函数或类来创建。这增加了代码的灵活性,可以更方便地替换或扩展对象类型。 3. **构造函数模式**:JavaScript中,构造函数用于创建具有相似...

    js 面向对象的技术创建高级 Web 应用程序

    在JavaScript中,创建对象的方式有多种。可以使用`new Object()`或直接使用对象字面量语法,如`{}`。在对象字面量内,可以立即定义属性,例如: ```javascript var userObject = { lastLoginTime: new Date() }; `...

    JavaScript数组对象JSON学习笔记

    3. **直接支持 JavaScript 对象:** JSON 与 JavaScript 对象非常相似,可以直接在 JavaScript 中使用。 ##### JSON 与 XML 的比较 1. **效率:** JSON 比 XML 更节省带宽,因为 JSON 的数据结构更加紧凑。 2. **...

    Pro_JavaScript_Design_Patterns

    2. **工厂模式**:提供一个接口来创建对象,而无需指定具体类。JavaScript的`new`操作符就是一种简单的工厂模式实现,但也可以通过函数或对象字面量创建更复杂的工厂。 3. **构造函数模式**:JavaScript的类是通过...

    javascript权威指南笔记

    10. **构造器和类**:JavaScript中的构造器是通过函数来创建类实例的,可以通过`new`关键字实例化。构造函数可以有或没有参数,类不一定是构造器,但构造器是类的一种形式。 11. **对象和属性**:可以使用点表示法...

    JavaScript与OOP

    - 构造函数方式:定义一个函数作为构造函数,通过`new`关键字创建对象,构造函数可以接收参数并创建私有和公共成员。 7. **对象属性和方法的定义** - **私有属性**:在构造函数内部定义,外部无法直接访问。 - *...

    jQuery源码分析-03构造jQuery对象

    这段代码表明,通过`jQuery`函数创建的对象实际上是通过`new jQuery.fn.init`来构造的。这意味着,每次调用`jQuery`时,实际上是在构造一个新的`jQuery.fn.init`实例。这为jQuery对象提供了一种统一的构造方式,并且...

    JavaScript中文参考手册

    5. **面向对象**:JavaScript通过构造函数和`new`操作符实现面向对象编程。对象可以通过字面量语法创建,也可以通过构造函数实例化。`this`关键字在函数或方法中引用当前对象,使得方法可以与特定对象关联。 6. **...

Global site tag (gtag.js) - Google Analytics