原型
- 概念:所谓原型就是指函数的
prototype属性所引用的对象- 只要定义一个函数,那么就会创建其原型
- 由上述函数创建出来的所有对象,都可以直接访问到原型上的成员
- 作用:实现同类对象之间的数据共享。
- 获取原型方式
- 通过函数:
fnName.prototype - 通过对象:
objName.__proto__ - 注意:以
__开头和结尾的属性均为非标准属性,原型默认具有constructor属性,引用的就是其构造函数
- 通过函数:
原型特性
动态性:置换原型记得重新要设置 constructor 属性指向构造函数!!!
- 动态性
- 在已有的原型上扩展成员,直接反映到已创建出来的对象上
- 如果置换了已有的原型,那么会反映到后面新创建的对象,而不会影响之前创建的对象
- 唯一性
- 由同一个构造函数创建出来的所有对象,都共享一个原型
- 不可变性(对于基本类型的属性)
- 不能通过对象来修改原型上的成员(仅对基本类型属性而言)
- 共享性
- 所有的对象都可以直接访问其原型上的成员
组合方式创建对象
- 组合原型和构造函数一起来创建对象
- 将私有的属性写在构造函数内
- 将共有的属性或行为写到其原型上
__proto__ 与 prototype
函数(方法)拥有自己特有的属性 – 原型属性 (prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(这个对象叫做原型对象)。原型对象也有一个属性,叫做 constructor,这个属性包含了一个指针,指回原构造函数。
在 js 中,万物皆对象。方法 (Function) 是对象,方法的原型 (Function.prototype) 是对象。因此,他们都会具有对象共有的特点。即对象具有属性
__proto__,可称为隐式原型。一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。
继承
注意:其他面向对象语言 C# Java swift 类与类之间继承,而在js中,是对象与对象之间的继承
概念:就是指 一个对象有权去访问另一个对象上的成员(属性和方法)
继承的实现
- 原型式继承
- 在原有的原型上扩展
- 置换原型
- 混入式:将要继承的对象上的所有成员拷贝一份,添加到本身。
- 原型式继承
Object.create方法
- 实现原型式继承(通过置换原型方法)
- 语法:
1
var newObj = Object.create(parent);
相关结论:
Object.prototype的原型为null- 默认原型对象的原型为
Object.prototype
属性搜索原则:当访问对象的某个属性时,
- 首先,在对象本身上查找,如果找到就返回值,并停止查找
- 如果没有找到就向其原型对象上查找,如果找到就返回值,并停止查找;
- 如果在没有找到,就继续向其原型的原型对象上查找,直到
Object.prototype - 此时如果找到就返回值,否则值为
undefined
原型链的概念
- 所谓原型链 就是指从一个对象到
Object.prototype之间存在一条体现继承层次关系的链式结构,这个结构被称为对象的原型链。 - 本质:链上的每一个对象都是通过
__proto__属性连接起来的。
绘制原型链
- 先简写对象的原型链
- 将上述原型链上的所有对象绘制在图形上。并且将和原型链相关的属性添加到对象上
- 给对象的每一个属性确定指向
- 如果在图形上的每一个对象的属性都有正确指向,说明绘制完成
Object.prototype 的方法简介
hasOwnProperty
- has 有
- own 自己的
- property 属性
- 语法:obj.hasOwnProperty(“propName”)
- 用来判断指定属性是否为对象自身的,而不是继承过来的;如果是自身的就返回 true,否则返回 false
isPrototypeOf
- is 是
- Prototype 原型
- of 的
- obj1.isPrototypeOf(obj2)
- 用来判断 obj1 对象是否为 obj2 对象的原型;如果是,就返回 true,否则返回 false
propertyIsEnumerable
- property 属性
- is 是
- Enumerable 可枚举的,可以使用
for in遍历出来的属性 - obj.propertyIsEnumerable(‘propName’)
- hasOwnProperty 升级版:
- 满足这2个条件返回 true,否则返回 false
- 指定的属性必须是对象本身的
- 该属性必须可枚举
装箱 与 拆箱
- 将基本数据类型 转换为 复合数据类型,这个过程被称为 装箱
- 将复合数据类型 转换为 基本数据类型,这个过程被称为 拆箱
强调几点
- 默认原型对象才具有
constructor属性 (置换原型之后需要手动添加constructor属性) - 只有函数具有
prototype属性(除了Function.prototype) - 任意的对象都具有
__proto__属性
instanceof介绍
obj instanceof constructor(构造函数)
规则:如果 constructor 的原型 出现在 obj 的原型链上的话,表达式返回值为 true,否则 false