构造函数模式

2023-02-14 围观热度 464技术推荐
  ECMAScript中的构造函数是用于创建特定类型对象的。像Object和Array这样的原生构造函数,运行时可以直接在执行环境中使用。当然也可以自定义构造函数,以函数的形式为自己的对象类型定义属性和方法。
Person()构造函数代替了createPerson()工厂函数。实际上,Person()内部的代码跟createPerson()基本是一样的,只是有如下区别。
❑ 没有显式地创建对象。
❑ 属性和方法直接赋值给了this。
❑ 没有return。
  另外,要注意函数名Person的首字母大写了。按照惯例,构造函数名称的首字母都是要大写的,非构造函数则以小写字母开头。这是从面向对象编程语言那里借鉴的,有助于在ECMAScript中区分构造函数和普通函数。毕竟ECMAScript的构造函数就是能创建对象的函数。
  要创建Person的实例,应使用new操作符。以这种方式调用构造函数会执行如下操
(1)在内存中创建一个新对象。
(2)这个新对象内部的[[Prototype]]特性被赋值为构造函数的prototype属性。
(3)构造函数内部的this被赋值为这个新对象(即this指向新对象)。
(4)执行构造函数内部的代码(给新对象添加属性)。
(5)如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
  constructor本来是用于标识对象类型的。不过,一般认为instanceof操作符是确定对象类型更可靠的方式。定义自定义构造函数可以确保实例被标识为特定类型,相比于工厂模式,这是一个很大的好处。构造函数不一定要写成函数声明的形式。赋值给变量的函数表达式也可以表示构造函数。
1.构造函数也是函数构造
  函数与普通函数唯一的区别就是调用方式不同。除此之外,构造函数也是函数。并没有把某个函数定义为构造函数的特殊语法。任何函数只要使用new操作符调用就是构造函数,而不使用new操作符调用的函数就是普通函数。
2.构造函数的问题
  构造函数虽然有用,但也不是没有问题。构造函数的主要问题在于,其定义的方法会在每个实例上都创建一遍。因此对前面的例子而言,person1和person2都有名为sayName()的方法,但这两个方法不是同一个Function实例。我们知道,ECMAScript中的函数是对象,因此每次定义函数时,都会初始化一个对象。
微信扫码咨询 微信扫码咨询
微信咨询 微信咨询