如果您熟悉JavaScript,您可能会知道可以使用多种不同的模式来创建对象:工厂函数,对象链接到其他对象(OLOO)和伪经典。 每种方法的复杂度各不相同。 今天,我将重点介绍我最难以解决的方法:伪古典模式。
很好地理解这种模式的最大障碍是,有太多的移动部件需要立即跟踪。 此外,您可能会对基于类的编程语言的对象实例化以及一些名称不正确的对象属性有任何先入为主的观念,而这一切都变得太难以理解了。
为了完全掌握它是如何工作的,我必须首先将以伪经典模式创建对象的过程分解为其组成部分。 然后,我观察了这些组件在整个执行过程中如何演变。 只有记录了整个过程,我才能够推断出实际发生的情况以及原因。
本文假定您已经对JavaScript中的对象创建有所了解。 也许您已经知道了伪古典模式,但是像我一样,正在努力理解它。
以下是这些组件的列表以及每个组件的快速定义:
1.“ 构造函数”
构造函数只是一个常规函数。 之所以称其为“与众不同”,是因为它仅用于构造新对象。 约定规定您大写构造函数。 这对程序没有任何有意义的影响,仅是向其他程序员表明该功能的意图。
//这是一个函数
函数dog(){
this.speak ='树皮';
}
//这是一个构造函数
函数Dog(){
this.speak ='树皮';
}
2.函数的’ .prototype’属性
在JavaScript中,函数是对象。 定义函数时,会自动为它提供一个名为.prototype的属性。 此属性指向另一个对象,该对象仅在使用新命令将该函数作为构造函数调用时使用。 将此对象视为“ DNA”,它将传递给此构造函数创建的新对象。
该.prototype对象包含其自己的名为.constructor的属性,并且它引用该函数本身。
狗=
.prototype = {
.constructor =狗
}
3.对象[[prototype]]属性
默认情况下,JavaScript中的每个对象都有一个名为[[prototype]]的属性。 您不能直接访问它,但是可以使用getter / setter属性.__ proto__在当今的大多数浏览器中间接访问它。 [[prototype]]属性引用包含其DNA的对象。 我刚才提到的那个DNA。
小狗=
。[[prototype]] = {
.constructor =狗
}
我特意在上面的定义中省略了一些属性,以使其更容易集中于与使用此模式创建对象最相关的组件。