这几天跟几个同事聊天发现他们对javascript什么时候该用new都不是很了解。
1、javascript的function什么时候该new什么时候不该new?
我觉得主要的问题还是集中在javascript的弱类型上面。
new在干什么
首先我们知道new是干什么,以我们java或.net的语言经验显然在创造对象。是的,不管是java还是.net。他是在创建一个对象。
new后面是什么
那么我们考虑一下new的后面是什么,(java和.net)一般是被一个class修饰的类名称。那么我们考虑一下,我们实例一个对象是干什么或者说设计者的目的是什么,那么一般情况下对象都会包含这些成员,属性与行为或者其中之一(我们在javaEE中DAO只有行为,POJO只有属性),有没有看到过既没有属性也没有行为的对象(当然类可以这么设计,但是没有意义)。
javascript的new干了什么
那么javascript的new干了什么?new其实开辟了内存空间创建了一个object这个object就是this,然后这个this的prototype指向了函数本身的prototype。
也就是说去new一个function的时候,开辟了一个this,这个this就是对象本身,再想想你去实例一个对象。你要拿到对象的成员,属性或方法或其中之一。this本身有几种方式能声明成员,一种在function函数体内部用this.的方式声明,例如:this.a = '123',其实就是给他的a属性赋了一个‘123’字符串,当然也可以赋值行为。还有种方式就是通过原型继承,通过function函数的.prototype的方式。
好了,因为javascript是弱类型,他没有class修饰,没有是否有返回值修饰,只有一个function修饰。所以function是否是构造函数很难通过函数头知道。所以是否需要去new就需要你去揣摩function的目的,他到底是不是构造函数。
实例代码说明
既然他是弱类型,他们可以根据内部的条件选择到底是做构造函数用,还是做普通函数用。再加上我们很多程序员都是其他语言出身,很少有人系统的学习了javascript,所以就很混淆。
下面我们来看混淆的例子吧。
Js代码
- function Hello() {
- this.a = '123';
- this.b = function () {
- alert('b');
- }
- return this;
- }
- Hello.prototype.c = function() {
- alert('c');
- }
- var aHello = new Hello();
- var bHello = Hello();
- alert(aHello.a)
- alert(bHello.a)
- aHello.b();
- bHello.b();
- aHello.c();
- bHello.c();
你会发现bHello.c()是执行不了的。在看看上面的函数,他为什么既能new又能不new。
new其实开辟了内存空间创建了一个object这个object就是this,然后这个this的prototype指向了函数本身的prototype。
不new就是执行了这个函数,最后return this就是返回了这个执行函数的宿主,其实就是window本身。
所以c函数是绑定在Hello的prototype上的,所以window上根本没有。
但是就出现了一个问题,就是如果在不执行c方法或者c本身不是通过原型继承的方式的话(就是不通过Hello的prototype方式,通过直接给this赋值的方式),其实创建的this的内容和window增加的内容是一样的,程序员会本能的以为new和不new是一样的。这样就掉坑里去了。
总结:javascript弱类型语言,一个函数即使是普通的执行函数,你new或不new都会出现编译器异常。
new与不new我们要做好以下几点。
1、首先大家要了解new本身干了什么,然后看函数创建者的意图,看函数结构。
2、一个好的程序员在提供某个javascript工具类或公用方法时,应该注释告诉你的调用者怎么去使用你提供的公用内容,或者提供工厂方法。
相关推荐
JavaScript要求开发者理解如何声明和使用对象。对象由属性(键值对)和方法(函数)组成,可以通过字面量语法或构造函数创建。 8.1.2 对象的构成 创建对象通常有两种方式:字面量语法和构造函数。例如,创建一个...
总的来说,这个压缩包提供了一个全面的JavaScript基础知识教程,涵盖了数据类型、Object、内置对象和变量等核心概念,对于初学者或者需要巩固基础的开发者来说,是一份非常有价值的参考资料。通过学习这些内容,可以...
本书适合有一定JavaScript基础的开发者阅读。通过本书的学习,读者可以深入了解面向对象编程的原理,并掌握如何在JavaScript中有效地运用这些原理来编写高质量的代码。此外,书中还包含了大量的示例代码和实践案例,...
本教程旨在为初学者提供一个全面的JavaScript基础知识学习平台,帮助理解并掌握这种强大的脚本语言。 《JavaScript基础教程》首先会介绍JavaScript的历史背景和基本语法,包括变量、数据类型、操作符、流程控制...
《JavaScript内核系列》和《JavaScript面向对象基础》这两本书是深入理解JavaScript编程的重要资源。JavaScript,作为一种广泛应用于Web开发的脚本语言,其内核和面向对象特性是开发者必须掌握的基础知识。以下是对...
面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...
JavaScript面向对象基础PPT,讲述了何谓面向对象、面向对象特点、组成及写法、工厂模式、原型以及如何将普通面向过程的代码转换为面向对象的基本原则
面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...
总结,这个精简版的JavaScript基础教程涵盖了语言的基本要素,从数据类型、运算符到控制流,再到对象、函数和事件处理,为初学者提供了一个全面的入门框架。理解并熟练运用这些知识点,是成为JavaScript开发者的首要...
以上就是JavaScript面向对象基础的一些关键点,掌握这些知识对于深入理解JavaScript和进行高效的代码编写至关重要。在实际编程中,还需要结合实际场景灵活运用这些概念,同时,随着JavaScript的发展,如ES6及后续...
JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序时不可或缺。其面向对象编程...同时,阅读提供的"Javascript面向对象基础"压缩包中的源代码将有助于加深理解,提升编程技能。
一、JavaScript基础 1. 变量与数据类型:JavaScript支持动态类型,允许声明变量时无需指定类型。基本数据类型包括字符串(String)、数字(Number)、布尔(Boolean)、空(null)、未定义(undefined)以及后来引入...
首先,手册的前几章会介绍JavaScript对象的基础知识,包括对象的创建、属性和方法的定义,以及对象与数据类型的关联。JavaScript中的对象是基于原型的,这意味着它们可以通过原型链共享属性和方法。此外,还会讲解...
1. 基础对象创建和属性操作:理解如何创建对象,包括字面量语法和构造函数,以及访问和修改对象的属性。 2. 构造函数与原型链:详细解释构造函数的工作原理,以及如何利用原型实现继承。 3. `new` 关键字的作用:...
面向对象编程的基础知识及其在JavaScript中的运用;数据类型、操作符以及流程控制语句;函数、闭包、对象和原型等概念,以代码重用为目的的继承模式;BOM、DOM、浏览器事件、AJAX和JSON;如何实现JavaScript中缺失的...
JavaScript基础知识点总结 JavaScript是一种高级的、动态的、基于对象的客户端脚本语言。它是在网页上执行的脚本语言,能实现网页的交互功能。下面是该资源中的重要知识点总结: 一、 JavaScript 基本概念 * ...
该课件适合于JavaScript入门,深入浅出、浅显易懂 压缩包里有四个PPT文件,分别为 1、JavaScript基础.ppt 2、JavaScript核心对象.ppt 3、JavaScript浏览器对象.ppt 4、JavaScript表单处理.ppt
JavaScript 是一种广泛应用于 Web 开发的...类的定义、实例化以及对象属性和方法的引用是理解和使用 JavaScript 面向对象编程的基础。通过深入理解这些概念,开发者可以更好地设计和构建复杂的 JavaScript 应用程序。