深刻理解原型与原型链

原型与原型链

规则

  1. 所有的对象都是通过new 函数创建的

  2. 所有的函数都是通过``new Function() 创建的`

  3. Function是一个函数,是直接放到内存里,不是new出来的,所以Function的隐式原型指向自己的原型,Function.prototype也是一个对象,所以Function.prototype.__proto__指向Object.prototype

    Function.__proto__ === Function.prototype
    Function.prototype.__proto__ === Object.prototype
    
  4. 所有的函数也是对象,可以具有属性

  5. 所有对象都是引用类型

函数原型

  1. 所有函数都具有一个prototype属性,称为函数原型

  2. 默认情况下,prototype就是一个普通的Object对象

  3. 默认情况下,prototype中有一个属性constructor,它是一个对象,指向函数本身

    Object.prototype.constructor === Object // true
    

隐式原型

  1. 所有的对象都有一个属性__proto__,称为隐式原型

  2. 实例对象的__proto__指向创建该实例构造函数的prototype

    function Person(name){
    	this.name = name
    }
    const p = new Person("法外狂徒")
    p.__proto__ === Person.prototype // true
    
  3. 问:已知实例对象,如何得到创建该对象的构造函数名称?

    const name = obj.__prototype__.constructor.name
    

原型链概念

  1. 每一个对象都有自己的原型__proto__,而原型也是对象,也会有自己的原型,依次类推,形成原型链。

  2. Object的原型的隐式原型指向null,即原型链的最顶端

    Object.prototype.__proto__ === null
    
  3. 对象访问某个属性:就近原则

原型链追溯

// 1. 对于创建的对象
function Person() {}
const p = new Person()
p.__proto__ => Person.prototype
Person.__proto__ => Object.prototype
Object.prototype.__proto__ => null

// 2. 对于创建的函数
function User(){}
User.__proto__ => Function.prototype
Function.prototype.__proto__ => Object.prototype
Object.prototype.__proto__ => null

练习

function User(){}
User.prototype.sayHello = function() {}
const u1 = new User()
const u2 = new User()

console.log(u1.sayHello === u2.sayHello) // true
console.log(User.prototype.constructor) // User
console.log(Function.__proto__ === Function.prototype)  // true
console.log(User.__proto__ === Function.prototype) // true
console.log(User.__proto__ === Function.__proto__) // true
console.log(u1.__proto__ === u2.__proto__) // true
console.log(u1.__proto__ === User.__proto__) // false
console.log(Function.__proto__ === Object.__proto__) // true
console.log(Function.prototype.__proto__ === Object.prototype.__proto__) // false
console.log(Function.prototype.__proto__ === Object.prototype) // true

高级API

W3C不推荐直接使用系统成员__proto__

Object.getPrototypeOf(obj)
获取函数的隐式原型
Object.prototype.isPrototypeOf(obj)
判断当前对象是否在指定的原型链上
instanceof
判断函数的原型是否在对象的原型链上
Object.create(obj)
创建一个新对象,其隐式原型指向指定的对象
Object.prototype.hasOwnProperty(属性名)
判断当前对象是否自身具有某个属性,而不是从原型链继承得来
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值