学习Javascript的原型知识!总结对象的查找过程,原型的this指向,如何创建一个新对象并写入原型!
学习链接
- 原型继承 (javascript.info)
- F.prototype (javascript.info)
- 原生的原型 (javascript.info)
- 原型方法,没有 proto 的对象 (javascript.info)
简介
原型
- 比如说一个数组的sort方法,join方法,就是从原型中来的
- 查找过程 - 向上找。。。
为什么要有原型?
- 对现有的对象进行扩展
- 保留原有方法的情况下,增加内容!
基本类型和对象的关系
- 比如字符串,数值,布尔类型。
- 会创建一个临时包装器对象
- 然后这个对象消失。。
- 举一个字符串的方法 - str.slice()
原型继承
原型继承
- 一个对象继承另一个对象,可以使用其中的方法!
- 使用的是
__proto__属性 - 两个下划线 (有新方法实现继承 - create()) __proto__属性 - 所有- rabbit可以访问到 animal中的变量 (原型继承)
原型继承的主要问题
- 方法查找 - 就近原则
- this指向 - 谁用给谁。该对象保存对应的变量!!
- 这个this 的好处 - 变量独立!
原型继承的限制
- 什么类型可以写入原型? - 对象 和null。。
- 不可以出现的情况 - 原型链闭环 - 原型链中间有环路。。
- 只可以继承一个对象!
for in 循环
- 如果继承的话,会遍历出在原型链中的属性。。
- for in 用于对象的遍历!- 会出现额外信息。。
- for of 专门用于数组。。有优化,不可对数组使用对象的方法,会改变数组的优化内容
如何解决 - for in 中出现的继承来的信息
- obj.hasOwnProperty(key),是自己的属性,才展示。
F.prototype
这个是给new 操作符用的!
new操作符 - 复习一下
- new是干什么的? - 创建对象 - 构造函数形式,还有一种叫 字面量{}
- new做了什么?
- new的好处 - 实现可重用的对象创建代码。
F.prototype的作用
- 在new的时候,给该对象设置
__proto__属性! - 连带原型一起给新对象了。。
文中的结构图!
这里有个constructor的属性
- 不是很理解。。。。跳过。。
默认的
"prototype"是一个只有属性constructor的对象,属性constructor指向函数自身。
原型的原型
如何获取原型上的原型?
- 继续使用
__proto__属性。。。
不要修改默认的原型,会出问题。。
设置原型的现代方法
关于原型 - 现代的方法有:
- Object.create(proto,
[desctiptors]) - 创建一个空对象 - 同时设置原型。 - Object.getPrototypeOf(obj) - 获取原型 - 从哪里来的。
- Object.setPrototypeOf(obj, proto) - 设置obj的原型 - 修改原型。。
通过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...
时代在变,我们的征途是星辰大海。