必须要了解的javaScript 原型

152 阅读3分钟

必须要了解的javaScript 原型

image.png

定义

javaScript 中所有的对象都有一个内置的属性[[prototype]]。在创建的时候几乎所有的对象都会被创建一个非空的值。有一种情况除外,就是Object.create(null),是没有[[prototype]]属性的。

所有的函数默认都会拥有一个名为 prototype 的公有并且不可枚举的属性,它会指向另一个对象,这个对象就是原型。

[[prototype]]有什么作用呢?

我们在获取对象属性和设置对象属性时候应用到了原型。

获取对象属性,调用的是对象的[[get]]行为。

1.先判断当前对象上是否有该属性,如果有判断是否是getter,调用getter方法

2.如果当前对象上没有该属性,则需要去它的[[prototype]]对象上查找,如果没有再去上一次prototype上查找,依次直到查找完整条prototype链,如果没有则返回undefined。

设置对象属性,调用对象的[[put]]行为

三种种情况:

1、当前对象上面有该属性

  • 判断当前属性是否setter,如果是调用set方法
  • 否则,判断该属性的属性描述符writable是否为true,是的话直接将值赋给属性,否则非严格模式下,代码不生效,严格模式下报T有TypeError

2.当前对象上不存在该属性且原型链上也不存在,直接赋值

3.当前对象上不存在,在原型链上存在

在原型链上存在,也会有以下几种情况:

  • 当前属性的属性描述符writable为true,则会在当前对象上创建一个新的属性,这个属性就是屏蔽属性
  • 当前属性的属性描述符writable为false,这个属性为只读的,非严格模式下,代码略过,否则报错,不会创建屏蔽属性
  • 当前属性是一个setter,则直接调用setter方法,不会创建屏蔽属性。

JavaScript没有类的概念,所以JavaScript一直是用原型实现类的功能,但是它的机制和其他面向对象语言的类不同。 面向类的设计模式: 实例化、继承和多态。

面向对象编程强调的是数据和操作数据的行为之间是相互关联的。

类就是对公共信息的封装。

1、类函数:

使用new Foo(),就像是实例化一个类,其实有很大的区别。一般其他面向对象语言中通过new得到的一个实例,是复制了所有类中的内容,但是JavaScript中只是引用了将两个对象通过prototype对象关联了起来。

子类继承父类,相当于将父类中所有内容复制到子类,但是JavaScript中子类继承父类,并不是将父类的内容复制到子类,只是将子类的prototype指向了父类的prototype。js中称为原型继承。

2、构造函数:

JavaScript中所有没有构造函数,之用通过new 调用后才可以成为构造函数。因此可以说是:函数并不是构造函数,当且仅当被new调用才会变成构造函数调用。

关联对象

将一个对象与另一个对象关联起来,简单而强大的功能就是Object.create(proto,ownProperty)