prototype
函数上的一个属性,prototype称之为原型
默认情况下,prototype是一个普通的object对象
constructor
默认情况下,prototype中有一个属性,constructor,它指向构造函数本身
proto
隐式原型,所有的对象上有一个属性,proto 被称之为隐式原型
注意:对象的隐式原型,指向创建该对象的构造函数的原型
当访问对象的属性时:
1.看该对象自身有没有这个属性,如果有直接使用
2.隐式原型中有没有,如果有直接使用,如果隐式原型中也没有,值为undefined
原型链
由所有的原型链接起来的一个链条
特殊点: Function.proto 指向Function.prototype
Object.prototype.proto 指向null
toString() 在所有构造函数上的原型中都被重写了
基础方法
-
Object.getPrototypeOf(对象) 获取某个对象的隐式原型
-
Object.prototype.isPrototypeOf(对象) 判断 Object.prototype在不在参数对象的原型链上
-
对象 instanceOf 函数 判断函数的原型在不在对象的原型链上 对象是否是由函数创建的 Object以外 只有创建当前的对象的构造函数是成立的 某个对象是不是某个数据类型(arr instanceOf Array arr是不是数组)
-
Object.create(对象) 创建一个新对象,其隐式原型指向指定的对象
-
对象.hasOwnProprety(属性名) 判断某个属性是否是当前对象自身的属性 Object是所有构造函数的父类
如何判断一个对象是不是数组
-
Array.isArray(对象)
-
对象.constructor === Array
-
对象 instanceof Array
-
Object.prototype.toString.call(对象) === '[object Array]' // 验证最严格
-
Object.getPrototypeOf(对象) === Array.prototype
将伪数组转换成真数组
Array.from(伪数组)
Array.prototype.slice.call(伪数组);
继承
function A(){}
function B(){}
// 让A构造函数能够继承 B构造函数
1.最原始的继承方法
B.prototype = A.prototype
// 会造成原型污染
2.传统的继承
B.prototype = new A();
3.借用构造函数
// 1. 借用构造函数添加属性
function A(a){
this.a =a
}
function B(b){
A.call(this,b);
}
// 2. 改变原型继承
B.prototype = Object.Create(A.prototype);
圣杯模式
封装继承方法