您当前的位置:首页 > 互联网教程

请用通俗易懂的语言帮我讲解一下js的构造函数的概念

发布时间:2025-05-21 17:31:08    发布人:远客网络

请用通俗易懂的语言帮我讲解一下js的构造函数的概念

一、请用通俗易懂的语言帮我讲解一下js的构造函数的概念

1、在JavaScript的世界里没有类的概念,JavaScript是一种基于对象的语言,它包含5中原生数据类型:

2、除此之外,其他所有的都是对象,函数也是一个对象

3、//这是一个函数声明,函数是一个特殊的对象

4、}

构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为函数==构造函数,它只是概念上的一个定义,使用它用来实例化对象。

5、构造函数,就是一个普通的函数,与其他函数没有任何区别,可以理解为函数==构造函数,它只是概念上的一个定义,使用它用来实例化对象。

6、对于JavaScript的内置对象,Object、Array、Date等等这些都是构造函数。

7、varo=newObj();//实例化

使用new运算符返回的对象并不一定是实例本身,也可以在构造函数用使用return改变返回值

8、使用new运算符返回的对象并不一定是实例本身,也可以在构造函数用使用return改变返回值

9、varo=newObj();//o并不是Obj的实例

10、console.log(o.a);//输出2

前面说到了函数也是一个对象,在JavaScript的内置对象中,所有的函数对象都是Function构造函数的实例,比如:Object、Array等等,这是一个很有意思的事情。

11、前面说到了函数也是一个对象,在JavaScript的内置对象中,所有的函数对象都是Function构造函数的实例,比如:Object、Array等等,这是一个很有意思的事情。

12、使用instanceof这个运算符就可以校验

13、instanceof运算符返回一个指定的对象是否一个类的实例,格式如:Ainstanceof B。其中,左操作数必须是一个对象,右操作数必须是一个类(构造函数)。

14、判断过程:如果函数B在对象A的原型链中被发现,那么instanceof操作符将返回true,否则返回false。

15、alert(FunctioninstanceofFunction);//Function函数对象本身就是自己的一个实例

16、alert(ObjectinstanceofFunction);//Object函数对象是Function构造函数的一个实例

上面说道instanceof的现象是一件很有意思的事情,如果想了解更多,需要阅读 JavaScript原型链继承相关的文章加深理解。

17、上面说道instanceof的现象是一件很有意思的事情,如果想了解更多,需要阅读 JavaScript原型链继承相关的文章加深理解。

二、js中new()如何改变构造函数返回值与this指向

1、这次给大家带来js中new()如何改变构造函数返回值与this指向,js中new()改变构造函数返回值与this指向的注意事项有哪些,下面就是实战案例,一起来看一下。

2、和其他高级语言一样 javascript中也有 new运算符,我们知道 new运算符是用来实例化一个类,从而在内存中分配一个实例对象。但在 javascript中,万物皆对象,为什么还要通过 new来产生对象?本文将带你一起来探索 javascript中 new的奥秘...

3、要创建 Person的新实例,必须使用 new操作符。

4、以这种方式调用构造函数实际上会经历以下 4个步骤:

5、(2)将构造函数的作用域赋给新对象(因此 this就指向了这个新对象);

6、(3)执行构造函数中的代码(为这个新对象添加属性);

7、在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class+ new的方式创建对象,在JavaScript中,我们将这类方式成为Pseudoclassical。

8、基于上面的例子,我们执行如下代码

9、var obj= new Base();这样代码的结果是什么,我们在Javascript引擎中看到的对象模型是:

10、new操作符具体干了什么呢?其实很简单,就干了三件事情。

11、obj.__proto__= Base.prototype;

12、Base.call(obj);第一行,我们创建了一个空对象obj

13、第二行,我们将这个空对象的__proto__成员指向了Base函数对象prototype成员对象

14、第三行,我们将Base函数对象的this指针替换成obj,然后再调用Base函数,于是我们就给obj对象赋值了一个id成员变量,这个成员变量的值是”base”,关于call函数的用法。

15、如果我们给Base.prototype的对象添加一些函数会有什么效果呢?

16、Base.prototype.toString= function(){

17、}那么当我们使用new创建一个新对象的时候,根据__proto__的特性,toString这个方法也可以做新对象的方法被访问到。于是我们看到了:

18、构造子中,我们来设置‘类'的成员变量(例如:例子中的id),构造子对象prototype中我们来设置‘类'的公共方法。于是通过函数对象和Javascript特有的__proto__与prototype成员及new操作符,模拟出类和类实例化的效果。

19、相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

三、js构造函数内部出现return会怎样

1、一提到js构造函数,可能很多人都会想到构造函数内部最好不要出现return甚至不要出现return的警告语。

2、那么,假如js构造函数内部出现了return,又会怎样呢?

3、注意红圈圈,显示p对象的类型是People。

4、如果在构造函数内部添加上一个return关键字会怎样呢?

5、是不是没有任何变化?!所以,仅仅添加一个return关键字是没有影响的。

6、同上,还是输出p查看结果,如图所示:

7、是不是有没有任何变化?!那就是了,return数字类型的也没有影响。

8、结果和没有添加return的时候是一样的,即return字符串是没有影响的。

9、依然是没有变化的,即return undefined;也是没有影响的。

10、对比发现,return null;也是没有影响的。

11、等等,怎么显示p的类型是Object,难道不应该是People吗?

12、是的,你没有说错,p的类型应该是People;但这里确实显示的是Object。说明添加return{};是有影响的,把构造函数内部的this给替换了。

13、 p的类型变成了function,显然受影响了。

14、构造函数内部仅仅添加return关键字,或者return的是数字、字符串、null、undefined等值类型的数据的时候,使用new关键字执行后对新产生的对象是没有影响的。

15、但是,一旦构造函数内部return的是对象、函数等引用类型的数据,使用new关键字执行后新对象的具体类型就被改变了。显然,正常情况下这并不是我们想要的结果。

16、而且,即使return值类型的数据不会改变新对象的具体类型,但也并没有什么实际意义。

17、所以呢,js构造函数内部还是不要出现return比较好啦!