老生常谈的原型链

prototype

只有函数有prototype,对象没有。

//函数
function A(){}
A.prototype
//会输出类似下面的东西
{
	constructor: A,
	__proto__:Object
}
//对象
a={}
a.prototype //输出undefined
//而如果你给一个对象赋予 prototype,效果不过是多了一个 prototype 属性

proto

__proto__可以看做是一种 “连接”, 所到之处的属性(property)都可以访问。

a = { c: 1 }
a.hasOwnProperty('c') // 输出 true

a 显然没有 hasOwnProperty 这个属性,于是他会往 proto 找,在 Object.prototype 下找到 hasOwnProperty 并使用。

一般,一个 proto 会被连接到一个 prototype,但你仍可以直接定义 proto

a.__proto__ = { b: 'b' }
a.b // 输出 b

所谓的原型链就是有一个个__proto__串成的。

proto 也可以直接连接到一个对象(换句话就是,继承一个对象的属性):

const person = {
  isHuman: false,
  printIntroduction: function() {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`)
  },
}
let me1 = {}
me1.__proto__ = person
// 这样 me1 就能使用 printIntroduction
// 不过还有更方便一点的方法,使用 Object.create,这样就不用自己连接
let me2 = Object.create(person)

实例化

new关键字的作用

在new一个对象时,实际上做了什么:
1. 在构造函数代码开始执行前,创建一个空的对象
2. 修改this的指向,把this指向刚刚创建出来的空对象
3. 执行函数的代码
4. 在函数完成之后返回this–即创建出来的对象

function Person(name) {
  this.name = name
}
Person.prototype.say = words => words
// 这是一个人类
let person1 = new Person('Lilas')
// 正常用 new 的结果是
// 1. 返回一个对象,
// 2. 这个对象运行了构造函数,
// 3. 这个对象可以使用 Person 的 prototype 的属性

// 知道了这三步,下面写一个自己的 new
function createInstance(klass, ...arg) {
  // 返回一个对象
  let obj = {}
  // 以对象为 this 运行构造函数 klass
  klass.call(obj, ...arg)
  // 为了让 obj 可以使用 Person.prototype 使用 __proto__ 连接
  obj.__proto__ = klass.prototype
  // 返回这个对象
  return obj
}

原型链流程图
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值