function fn () {}
const A = {}
const B = new fn()
- 先问一个问题,对象A和对象B一样吗?
B.__proto__ === A.__proto__ // false
B.constructor === A.constructor // false
他们的原型和构造器都不一样, 那他们之间存在什么关系呢?答案是:
B.__proto__ === A.__proto__ // false
B.__proto__.__proto__ === A.__proto__ // true
如果看到这里,相信你已经学会如何在Es5之前实习类的继承了:只需让其实例对象的构造器原型的__proto__属性指向其父类原型而不是Object的原型即可.
在 JavaScript 中,几乎所有的对象都是
Object类型的实例,它们都会从Object.prototype继承属性和方法。 但是他们和Object之间到底是什么关系?
- function(){}和()=>{}之间的关系?
function F(){}
const A = () => {}
F.constructor === A.constructor // true
F.__proto__ === A.__proto__ // true
A.prototype // undefined
F.prototype // f () {}
这是符合我们认知的,匿名函数没有prototype属性。
每个 JavaScript 函数实际上都是一个
Function对象。运行
(function(){}).constructor === Function // true
便可以得到这个结论。
- Function和Object之间有关系吗?是什么样的关系呢?
Function.prototype.__proto__.constructor === Object // true
Object.__proto__.constructor === Function // true
- Function 与 A = ()=>{},function F(){}之间的关系?
// 上面提到了
F.constructor === A.constructor // true
F.__proto__ === A.__proto__ // true
// 他们的构造器就是Function
F.constructor === Function // true
// 他们的__proto__的构造器也是Function
F.__proto__.constructor === Function // true
- 怎么记住这张图?
事实上他们存在一定的规律
横向来看:
function fn(){}
const instance = new fn()
// Function和()=>{}之间
Function.prototype === (()=>{}).__proto__ // 规律1
Function === (()=>{}).constructor // 规律2
// function fn(){}和new fn()之间
fn.prototype === instance.__proto__ // 规律1
fn === instance.constructor // 规律2
// Object和{}之间
Object和.prototype === ({}).__proto__ // 规律1
Object和 === ({}).constructor // 规律2
纵向来看:
// constructor 的关系
Function.constructor === Function
Fn.constructor === Function
Object.constructor === Function
// __proto__ 的关系
Function.__proto__ === Fn.__proto__
Fn.__proto__ === Object.__proto__
// prototype 的关系
///趋向Object
Function.prototype.__proto__ === Object.prototype
fn.prototype.__proto__ === Object.prototype
/// 仅Function,function,Object存在prototype属性,并且他们的prototype的constructor都等于他们本身
Function.prototype.constructor === Function
fn.prototype.constructor === fn
Object.prototype.constructor === Object
趋势看:
读取对象的 constructor 向 Function 靠拢。
读取对象的__proto__ 向 null 靠拢。
读取对象的 prototype 向 undefined 靠拢。
其余的自求多福吧。希望这不是八股文~(目前还没有看到那么变态的)
给看到最后的朋友献上一份更简单的图例: