原型的特殊点

// 创建一个学生对象

function Student(name, age) {
    this.name = name;
    this.age = age;
}
console.log(Student); //方法体
console.log(Student.__proto__); //ƒ () { [native code] } 
console.log(Function.prototype); //ƒ () { [native code] } prototype原型,本质是一个对象
//Student()函数是通过new Function出来的,所以Student()方法是Function的实例对象
console.log(Student.__proto__ === Function.prototype); //true
//Function的原型,是new Function出来的对象的隐式原型__proto__

console.log(Student.__proto__.constructor); //ƒ Function() { [native code] }
//Student()函数的隐式原型的constructor属性,指向Function函数本身
console.log(Function); //ƒ Function() { [native code] } 
console.log(Student.__proto__.constructor === Function); //true
console.log(Student.__proto__.__proto__); //结果是Object.prototype Object的原型
console.log(Object.prototype);

console.log(Student.__proto__.__proto__ === Object.prototype);
// 同理
console.log(Function.prototype.__proto__ === Object.prototype);
// Student.__proto__===Function.prototype 所以解释为Function的原型(对象)的隐式原型
console.log(Function.__proto__ === Function.prototype); //Function的隐式原型===Function的原型 **
console.log(Student.__proto__.__proto__.__proto__); //null
console.log(Object.__proto__ === Function.__proto__); //true

console.log(Object.__proto__ === Function.prototype);
console.log(Object.__proto__ === Function.__proto__);
console.log(Function.__proto__ == Function.prototype);

console.log(Object.prototype); //对象构造方法的原型
console.log(Object.prototype.__proto__); //null 
console.log(Function.prototype.__proto__); //Object的原型
console.log(Function.__proto__.__proto__); //Object的原型

本篇主要来介绍原型链:代码中我们首先创建了一个函数,这里是一个构造函数,我们console.log()方法打印函数,在控制台中显示的是一个方法的结构内容。
函数才会有原型,对象才会有隐式原型。
由于函数本身是Function构造方法创建出来的,所以函数也是对象,Student的__proto__属性即隐式原型,指向的就是Function的原型。他们指向的是同一个地址,所以===判断的时候为true。
函数的原型prototype,本是是一个对象,其中有一个属性constructor,这个属性指向的是函数本身。
Student.proto.proto,这句话的意思是,Student函数的隐式原型的隐式原型,Student函数的隐式原型是Function的原型,原型是一个对象,对象是通过Obejct方法构造出来的,这个对象的隐式原型就为Object的原型。
Function.__protot__是一个比较特殊的一个点,Function.protot===Function.__prototype,就是函数构造函数的原型‘全等于’函数构造函数对象的隐式原型。这句话我们需要这样理解,Function既是函数,也是对象,当Function作为函数的时候,Function函数有自己原型,当Function作为对象的时候,Function对象有隐式原型。‘Function对象’是Function函数new出来的’,Function对象的隐式原型指向Function函数的原型。
Object.proto === Function.prototype另一个比较特殊点,Object是一个函数,函数的__proto__指向Function的原型。
console.log(Function.proto.proto); //Object的原型 这一句中Function.__proto__中Function作为对象,结果为Function函数的原型,函数的原型本身是一个对象,所以它的__proto__是Object的原型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值