JavaScript——对原型和原型链的理解

117 阅读2分钟

一、对原型和原型链的理解

在JavaScript中是使用构造函数来新建一个对象的,每一个构造函数的内部都有一个 prototype 属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针被称为对象的原型。一般来说不应该能够获取到这个值的,但是现在浏览器中都实现了 proto 属性来访问这个属性,但是最好不要使用这个属性,因为它不是规范中规定的。ES5 中新增了一个 Object.getPrototypeOf() 方法,可以通过这个方法来获取对象的原型。

当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,这个原型对象又会有自己的原型,于是就这样一直找下去,也就是原型链的概念。原型链的尽头一般来说都是 Object.prototype 所以这就是新建的对象为什么能够使用 toString() 等方法的原因。

特点: JavaScript 对象是通过引用来传递的,创建的每个新对象实体中并没有一份属于自己的原型副本。当修改原型时,与之相关的对象也会继承这一改变。

二、总结:

1.原型:

每创建一个构造函数里面都会默认有一个prototype属性,它默认指向一个Object空对象(又称为:原型对象)

原型又分为显式原型和隐式原型:

    显式原型:每个函数function都有一个prototype,也就是显式原型

    隐式原型:每个实例对象都有一个__proto__,也就是隐式原型

    对象的隐式原型的值=其对应构造函数的显示原型的值

函数的prototype属性:

定义函数时自动添加的,默认是一个object对象

对象的__proto__属性:

创建对象时自动添加的,默认值为构造函数prototype属性值

2.原型链:

访问一个对象的属性时候,首先自身属性中查找,查找到就返回;倘若没有,就沿着__proto__这条链向上查找,找到返回;倘若最终都没有找到,返回undefined

原型链的作用: 查找对象的属性

最后: Object原型对象原型链的尽头。