JS的原型链

2019-06-05  本文已影响0人  amenema

JS的原型链

本文阐述了js中的prototype,constructorproto之间的关系。
同时梳理了js如何实现继承的。

属性释义

实例属性与类属性

属性之间的关系

1.jpg
//定义一个构造函数 
var Foo = function(){}

此时[1] Foo.prototype = {constructor: Foo, __proto__:Object.prototype}
即:Foo.prototype.__proto__ === Object.prototype,
因为 Foo.prototype的值是个Object实例,
所以[3] {}.__proto__ = Object.prototype

console.log(Foo.prototype.__proto__ === Object.prototype
console.log(Foo.prototype.constructor === Foo)
var f1 = new Foo()
//此时[2] f1.__proto__ === Foo.prototype
console.log(f1.__proto__ === Foo.prototype)

Foo是我们自定义的构造函数,JS内置的构造函数也是同样的如Object,这里的Object是个构造函数
Object.prototype = {constructor: Object, __proto__: null}

console.log(Object.prototype.__proto__)
//null

为什么[4] Object.prototype.__proto__会是null呢?
Object.prototype 不是为 {} 吗, {}.__proto__不应该
Object.prototype吗?而且我们自定义的构造函数就是这个样子呀!

如果设置Object.prototype.__proto__ = Object.prototype 那么,当查找一个不存在的属性时,JS
会从上级原型链去查这个属性,便会出现死循环,所以ES5规定Object.prototype.__proto__ = null
而且Object.prototype 指向的对象并不是继承自Object,即它不是Object的实例。

原文:15.2.4

The value of the [[Prototype]] internal property of the Object prototype object is null, the value of the [[Class]] internal property is "Object", and the initial value of the [[Extensible]] internal property is true.

上面提到JS内置的构造函数Object,在JS中函数也是一种对象,即也存在Object.__proto__ 那么它指向谁呢?当然是Function.prototype了,因为
Functionjs中所有function的构造函数,所以function Object(){}Function的一个实例。
所以[7] Object.__proto__ === Function.prototype

console.log(Object.__proto__ === Function.prototype)
//true

JSFunction也是一个构造函数。
所以[9] Function.prototype = {constructor: Function, __proto__: Object.prototype}
[10] Function.__proto__ = Function.prototype

至此便是一个完整的JS原型链。

上一篇 下一篇

猜你喜欢

热点阅读