深入了解JavaScript中的构造器

深入了解JavaScript中的构造器

对构造函数有很好的理解是你掌握JavaScript这门语言的重点。我们都知道JavaScript不像其他语言,它没有class关键字,但是它有跟function非常相似的构造函数。这篇文章我们一起来详细地了解JavaScript构造函数如何构造对象。

构造函数跟普通函数非常相似,但是我们通过new关键字来使用它们。主要有两种类型的构造函数,native构造函数(Array,Object)它们可以在执行环境中自动生成,还有自定义的构造函数,你可以定义自己的方法和属性。

当你想要创建很多相似的对象(拥有相同的属性和方法)的时候,使用构造函数是非常有效的。大部分程序员都遵循公约,使用大写字母开头来将构造函数和普通函数区分开。看看下面的代码。

function Book() {     // unfinished code} var myBook = new Book();

登录后复制

最后一行代码创建了一个Book对象,并把它赋值给变量;这样完成之后,即使Book构造器没有做任何操作,myBook也是Book实例。正如你看到的,除了首字母大写和使用new关键字之外,构造函数和普通函数并没有什么区别。

立即学习“Java免费学习笔记(深入)”;

判断实例的类型

判断某个对象是否为某种实例,我们可以使用instanceof操作符:

myBook instanceof Book    // => truemyBook instanceof String  // => false

登录后复制

注意:如果右边不是一个函数的实例,那么将会报错:

myBook instanceof {}; // => TypeError: invalid 'instanceof' operand ({})

登录后复制

另一种方法是使用constructor属性,所有对象实例都有一个constructor属性,这个属性指向创建它的构造函数。

myBook.constructor == Book;   // => true

登录后复制

就像myBook的constructor指向Book一样。 所有对象都从它们的原型上继承了constructor这个属性:

var s = new String("text");s.constructor === String;      // => true"text".constructor === String; // => truevar o = new Object();o.constructor === Object;      // => truevar o = {};o.constructor === Object;      // => truevar a = new Array();a.constructor === Array;       // => true[].constructor === Array;      // => true

登录后复制

尽管使用constructor可以用来检测实例类型,但是建议还是使用instanceof方法。因为constructor属性是可以被重写的..用起来不太靠谱。

自定义构造函数

构造函数就像饼干印模。同一印模制作出来的,都是同一个diao样(男人没一个好东西也是这个道理)。

function Book(name, year) {    this.name = name;    this.year = '(' + year + ')';}

登录后复制

Book构造器需要两个参数,当使用new关键字构造对象时,会把两个形参传给Book对象的name 和 year。

var firstBook = new Book("Pro AngularJS", 2014);var secondBook = new Book("Secrets Of The JavaScript Ninja", 2013); var thirdBook = new Book("JavaScript Patterns", 2010);console.log(firstBook.name, firstBook.year);           console.log(secondBook.name, secondBook.year);           console.log(thirdBook.name, thirdBook.year);

登录后复制

1.png

如你所见,我们可以通过传不同参数,快速创建另一本书。JavaScript的Array(),Date()也是这个道理。

Object.defineProperty 方法

Object.defineProperty 方法可以在构造器中被使用来配置属性。

function Book(name) {     Object.defineProperty(this, "name", {         get: function() {             return "Book: " + name;               },                set: function(newName) {                        name = newName;                },                       configurable: false         }); }var myBook = new Book("Single Page Web Applications");console.log(myBook.name);    // => Book: Single Page Web Applications// we cannot delete the name property because "configurable" is set to falsedelete myBook.name;    console.log(myBook.name);    // => Book: Single Page Web Applications// but we can change the value of the name propertymyBook.name = "Testable JavaScript";console.log(myBook.name);    // => Book: Testable JavaScript

登录后复制

上面的代码中是调用了祖先的方法。它提供了getter和setter接口。getter方法负责返回封装的值,setter方法接受参数,并把值赋给属性。当我们在某个属性上操作存取时,调用的就是这两个方法。通过配置configurable,我们可以设置该值能否被删除。

对象字面量表示法是首选的构造函数

JavaScript语言九种内建的构造器:Object(), Array(), String(), Number(), Boolean(), Date(), Function(), Error() 以及 RegExp()。当我们需要创建这些值的时候,我们可以自由选择使用字面量或者构造器。但是相同情况下,字面量对象不仅易读,而且运行速度更快,因为他们可以在解析的时候被优化。所以当你需要使用简单对象的时候就使用字面量吧。

// a number object// numbers have a toFixed() methodvar obj = new Object(5);obj.toFixed(2);     // => 5.00// we can achieve the same result using literalsvar num = 5;num.toFixed(2);     // => 5.00// a string object// strings have a slice() method var obj = new String("text");obj.slice(0,2);     // => "te"// same as abovevar string = "text";string.slice(0,2);  // => "te"

登录后复制

使用new关键字是必不可少的

记得使用构造器的时候要用new关键字,如果你不小心忘记了,那么构造器中的this指向的是global对象(浏览器中默认为window)。

function Book(name, year) {    console.log(this);    this.name = name;    this.year = year;}var myBook = Book("js book", 2014);  console.log(myBook instanceof Book);  console.log(window.name, window.year);var myBook = new Book("js book", 2014);  console.log(myBook instanceof Book);  console.log(myBook.name, myBook.year);

登录后复制

上面的代码运行结果如下所示:

2.png

如果是在严格模式下,上面的代码将会抛出错误,因为严格模式不允许我们不使用new关键字调用构造器。

适用范围更高的构造器

为了解决可能会忘记使用new关键字的风险,我们可以通过判断this的值创建适用范围更高的构造器。

function Book(name) {     if (!(this instanceof Book)) {         // the constructor was called without "new".        return new Book(name);    } }

登录后复制

加上这段代码之后,我们就可以‘肆无忌惮’地使用构造器了。

function Book(name, year) {     if (!(this instanceof Book)) {         return new Book(name, year);    }    this.name = name;    this.year = year;}var person1 = new Book("js book", 2014);var person2 = Book("js book", 2014);console.log(person1 instanceof Book);    // => trueconsole.log(person2 instanceof Book);    // => true

登录后复制

很多内建的构造器都是这么做的。通过判断this是否为当前类型。如果程序员忘记加new关键字,那么我们就返回一个通过new出来的对象。

结论

JavaScript没有类这种说法(但是它可以使面向对象的),所以对于习惯了使用类的程序员来说是种困惑。当然JavaScript的构造函数跟普通函数没什么区别,只是通过new关键字生成出来而已。如果我们需要”印饼干”的话,它就非常有用了。

更多编程相关知识,请访问:编程入门!!

以上就是深入了解JavaScript中的构造器的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2725297.html

(0)
上一篇 2025年3月7日 23:22:05
下一篇 2025年2月18日 03:51:40

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JS中的一些常用基础算法介绍

    一个算法只是一个把确定的数据结构的输入转化为一个确定的数据结构的输出的function。算法内在的逻辑决定了如何转换。 基础算法 一、排序 1、冒泡排序 //冒泡排序function bubbleSort(arr) {  for(var i…

    2025年3月7日
    200
  • 详解JavaScript中的变量、范围和提升

    变量是许多编程语言的基本组成部分,也是新手需要学习的第一个也是最重要的概念。JavaScript中有许多不同的变量属性,以及命名变量时必须遵循的一些规则。在JavaScript中,有三个关键字用于声明变量——var、let和const——每…

    2025年3月7日
    200
  • js怎么删除数组中指定元素?

    js中删除数组中指定元素的方法:首先通过循环遍历该数组得到指定元素的索引值,然后根据索引值使用splice()方法即可删除元素,语法“array.splice(索引值,1)”。 JavaScript中删除数组中指定元素的方法详解: 删除数组…

    2025年3月7日
    200
  • 所以 JavaScript 到底是什么?

    JavaScript栏目今天带大家搞清JavaScript到底是什么。 前言 引用《javascript 高级程序设计第四版》中说的话——“从简单的输入验证脚本到强大的编程语言,javascript 的崛起没有任何人预测到。它很简单,学会用…

    2025年3月7日
    200
  • 了解JavaScript中的数据类型转换

    在JavaScript中,数据类型用于对一种特定类型的数据进行分类,确定可以分配给该类型的值以及可以对其执行的操作。 虽然由于类型强制,JavaScript会自动转换许多值,但为了达到预期的结果,通常最好在类型之间手动转换值。 本教程将指导…

    2025年3月7日
    200
  • 深入理解DOM树和节点

    DOM通常被称为DOM树,由称为节点的对象树组成。在DOM简介中,我们讨论了文档对象模型(DOM),如何使用控制台访问document对象和修改其属性,以及HTML源代码和DOM之间的区别。 在本教程中,我们将回顾HTML术语,这对于使用J…

    2025年3月7日 编程技术
    200
  • 了解JavaScript中的回调函数并使用它们

    在JavaScript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用。既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回。 因为函数是第一类对象,我们可以在JavaS…

    2025年3月7日
    200
  • 深入浅析ES6中的箭头函数及其作用域

    在ES6很多很棒的新特性中, 箭头函数 (或者大箭头函数)就是其中值得关注的一个! 它不仅仅是很棒很酷, 它很好的利用了作用域, 快捷方便的在现在使用以前我们用的技术, 减少了很多代码……但是如果你不了解箭头函数原理…

    2025年3月7日
    200
  • 介绍我们是如何搭建互动应用

    今天javascript栏目介绍我们是如何搭建互动应用的。 搭建互动应用 前言 本文从前端的角度出发,简单地介绍了搭建互动应用的一种思路,提供了在线互动、中途加入两个场景的一种解决思路,最后简单介绍了互动应用在实践中的优化方向。通过阅读你可…

    2025年3月7日 编程技术
    200
  • 了解JS中的var、let和const

    本篇文章给大家介绍一下JavaScript 的 var,let 和 const,有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 var var 语句用来在 JavaScript 中声明一个变量,该变量遵守以下规则: 作用域…

    2025年3月7日
    200

发表回复

登录后才能评论