现代Javascript教程 - 学习笔记11 - 原型

142 阅读3分钟

学习Javascript的原型知识!总结对象的查找过程,原型的this指向,如何创建一个新对象并写入原型!

学习链接

简介

原型

  • 比如说一个数组的sort方法,join方法,就是从原型中来的
  • 查找过程 - 向上找。。。

image.png

为什么要有原型?

  • 对现有的对象进行扩展
  • 保留原有方法的情况下,增加内容!

image.png

基本类型和对象的关系

  • 比如字符串,数值,布尔类型。
  • 会创建一个临时包装器对象
  • 然后这个对象消失。。
  • 举一个字符串的方法 - str.slice()

image.png

原型继承

原型继承

  • 一个对象继承另一个对象,可以使用其中的方法!
  • 使用的是 __proto__ 属性 - 两个下划线 (有新方法实现继承 - create())
  • __proto__属性 - 所有
  • rabbit可以访问到 animal中的变量 (原型继承)

image.png

原型继承的主要问题

  • 方法查找 - 就近原则
  • this指向 - 谁用给谁。该对象保存对应的变量!!
  • 这个this 的好处 - 变量独立!

image.png

image.png

原型继承的限制

  • 什么类型可以写入原型? - 对象 和null。。
  • 不可以出现的情况 - 原型链闭环 - 原型链中间有环路。。
  • 只可以继承一个对象

for in 循环

  • 如果继承的话,会遍历出在原型链中的属性。。
  • for in 用于对象的遍历!- 会出现额外信息。。
  • for of 专门用于数组。。有优化,不可对数组使用对象的方法,会改变数组的优化内容

image.png

如何解决 - for in 中出现的继承来的信息

  • obj.hasOwnProperty(key),是自己的属性,才展示。

image.png

F.prototype

这个是给new 操作符用的!

new操作符 - 复习一下

  • new是干什么的? - 创建对象 - 构造函数形式,还有一种叫 字面量{}
  • new做了什么?
  • new的好处 - 实现可重用的对象创建代码。

image.png

F.prototype的作用

  • 在new的时候,给该对象设置 __proto__ 属性!
  • 连带原型一起给新对象了。。

image.png

文中的结构图! image.png

这里有个constructor的属性

  • 不是很理解。。。。跳过。。

默认的 "prototype" 是一个只有属性 constructor 的对象,属性 constructor 指向函数自身。

image.png

原型的原型

如何获取原型上的原型?

  • 继续使用__proto__属性。。。

image.png

不要修改默认的原型,会出问题。。

设置原型的现代方法

关于原型 - 现代的方法有:

  • Object.create(proto, [desctiptors]) - 创建一个空对象 - 同时设置原型。
  • Object.getPrototypeOf(obj) - 获取原型 - 从哪里来的。
  • Object.setPrototypeOf(obj, proto) - 设置obj的原型 - 修改原型。。

image.png

image.png

通过Object.create() 来克隆!

  • 全部
  • 浅拷贝。
  • 包含所有内容 - 包括get 和set(对象自带属性)
  • Object.assign() - 不能拷贝get 和set!只能可枚举属性
let clone = Object.create(
    Object.getPrototypeOf(obj), 
    Object.getOwnPropertyDescriptors(obj));

此调用可以对 obj 进行真正准确地拷贝,包括所有的属性:可枚举和不可枚举的,数据属性和 setters/getters —— 包括所有内容,并带有正确的 [[Prototype]]

总结

主要梳理了一下原型的基础概念,具体还要到实际应用中思考!

  • 如何继承 - __proto__,
  • 查找过程 - 向上
  • for in 会附带继承的属性,需要判断一下 - hasOwnProperty()
  • 基本类型和对象的关系 - 临时包装器对象
  • 原型继承的主要问题 - this是谁的 + 就近原则
  • new的时候附带原型 - prototype属性
  • 现代的原型方法 - create,get,set...

时代在变,我们的征途是星辰大海。