JavaScript知识:构造函数也是函数

构造函数就是初始化一个实例对象,对象的prototype属性是继承一个实例对象。本文给大家分享javascript构造函数详解,对js构造函数相关知识感兴趣的朋友一起学习吧

首先要明确的是构造函数也是函数

我经常使用构造函数来创建实例对象,例如对象和数组的实例化可以通过相应的构造函数Object()和Array()完成。

构造函数与普通函数在语法的定义上没有任何区别,主要的区别体现在以下3点。

(1)构造函数的函数名的第一个字母通常会大写。按照惯例,构造函数名称的首字母都是要大写的,非构造函数则以小写字母开头。这是从面向对象编程语言那里借鉴的,有助于在ECMAScript中区分构造函数和普通函数。

(2)在函数体内部使用this关键字,表示要生成的对象实例,构造函数并不会显式地返回任何值,而是默认返回“this”。在下面的代码段中,Person()函数并没有使用return关键字返回任何信息,但是输出的变量person1是一个具有name、age属性值的Person实例。

   Document 

显示效果如下


(3)作为构造函数调用时,必须与new操作符配合使用。这一点非常重要,任何函数只要使用new操作符调用就是构造函数,而不使用new操作符调用的函数就是普通函数。

1、构造函数的定义与调用

构造函数又称为自定义函数,以函数的形式为自己的对象类型定义属性和方法。

举例:

   Document 

2、new关键字的用途

构造函数在执行时,会执行以下4步:

  • 通过new关键字(操作符)创建实例对象,会在内存中创建一个新的地址。
  • 为构造函数中的this确定指向,指向实例的本身。
  • 执行构造函数代码,为实例添加属性。
  • 返回这个新创建的对象。

以前面生成person1实例的代码为例。

第一步:为person1实例在内存中创建一个新的地址。

第二步:确定person1实例的this指向,指向person本身。

第三步:为person1实例添加name、age和sayName属性,其中sayName属性值是一个函数。

第四步:返回这个person1实例。

举个实例

 var person1 = new Person("Bob", 18); 

这行代码,等价于

 // 演示 new 的功能 function Person(name,age) { // 1.创建一个新对象 var instance = new Object(); // 2.将函数内部的 this 指向了这个新对象 this = instance; // 3.执行构造函数内部的代码 this.name = name; this.age = age; this.sayName = function () { console.log(this.name); }; // 4.将新对象作为返回值 return instance; } 

这就意味着,将instance 赋值给 person1,即person1 = instance。实际上又是这样的:

 // 演示 new 的功能 function Person(name,age) { // 1.创建一个新对象 var person1 = new Object(); // 2.将函数内部的 this 指向了这个新对象 this = person1; // 3.执行构造函数内部的代码 this.name = name; this.age = age; this.sayName = function () { console.log(this.name); }; // 4.将新对象作为返回值 return person1; } 

3、构造函数的问题:浪费内存

基本事实:不同实例中的sayName属性是不同的。举个例子:

   Document 

解释:通过console.log(person1.sayName === person2.sayName)方法可判断两个函数是否是是同一个,显然这不是同一个函数,那么两个函数就占用了两个内存空间,就会造成内存的浪费。

那如何解决函数占用内存的办法呢?答案是将对象内部函数提取出来作为公共函数

   Document 

此时,也存在一个问题,如果有多个公共函数,需要在外部创建多个函数,可能会造成命名冲突

解决办法,将多个公共的函数封装到一个对象

   以上就是JavaScript知识:构造函数也是函数的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » JavaScript 教程