JS原型和原型链
-
原型
- 原型(prototype):保存所有子对象共有成员的对象
- 每个构造函数都有一个原型属性,引用了该构造函数对应的原型对象
- 由构造函数创建的每个对象中都有一个__proto__属性,指向构造函数的原型对象
- 在访问子对象的成员时,优先在成员本地找,找不到,再去构造函数的原型中查找
-
创建原型
- 创建空对象
- 调用构造函数,为新对象添加成员
- 设置当前对象的__proto__属性为构造函数的原型对象
- 每个对象自有的成员,放在构造函数中
- 所有子对象共有的成员,放在原型对象中
-
原型链
- 由各级对象的__proto__逐级向上引用形成的多级继承关系
- 所有的对象都有一个__proto__属性,指向自己的父对象
-
原型相关API
- 判断一个属性是否可用
- in关键字:
"属性名" in 对象
- 如果"属性名"在当前对象的原型链中,返回true
- 如果在整条原型链上都没找到,返回false
- 使用===undefined:说明不包含
- 简写为
(!对象.成员名)
- 简写为
- 判断是否自有属性:
obj.hasOwnProperty("成员");
- 如果obj本地有指定"成员",则返回true,没有返回false
- 判断共有属性:
- 不是自有的,还要存在于原型链上
if(!obj.hasOwnProperty("成员")&&"成员" in obj)
- in关键字:
- 获得任意对象的__proto__属性:
- 获得父级对象
var 父对象=Object.getPrototypeOf(对象);
- 判断父对象是否处在子对象原型链的上级:
父对象.isPrototypeOf(子对象);
- 只要父对象在子对象的原型链上,就返回true,否则返回false
- 删除对象中的属性:
delete 对象.成员
- 只能删除自有的成员
- 只有var声明的全局变量不让delete
- 使用window.或window[""]增加的全局成员可以delete
- 判断一个对象是数组的几种方法
Array.prototype.isPrototypeOf(obj)
- 如果返回true,说明是数组,否则不是
obj instanceof Array
- 对象 instanceof 类型名,返回true,说明是数组
- instancof会查找原型链上所有原型的构造函数
Object.getPrototypeOf(obj)==Array.prototype
Object.prototype.toString.call(arr)
- override,子对象觉得父对象的成员不好用
- 可自己定义同名的自有成员覆盖父对象
Object.prototype.toString.apply(arr)
- call和apply: 在调用方法的一瞬间,替换调用方法的对象
Array.isArray(obj)
- 专门判断对象是否是数组!
- 判断一个属性是否可用