原型和原型链

prototype

函数上的一个属性,prototype称之为原型

默认情况下,prototype是一个普通的object对象

constructor

默认情况下,prototype中有一个属性,constructor,它指向构造函数本身

proto

隐式原型,所有的对象上有一个属性,proto 被称之为隐式原型

注意:对象的隐式原型,指向创建该对象的构造函数的原型

当访问对象的属性时:

        1.看该对象自身有没有这个属性,如果有直接使用

        2.隐式原型中有没有,如果有直接使用,如果隐式原型中也没有,值为undefined

原型链

由所有的原型链接起来的一个链条

特殊点: Function.proto 指向Function.prototype

Object.prototype.proto 指向null

toString() 在所有构造函数上的原型中都被重写了

基础方法

  1. Object.getPrototypeOf(对象) 获取某个对象的隐式原型

  2. Object.prototype.isPrototypeOf(对象) 判断 Object.prototype在不在参数对象的原型链上

  3. 对象 instanceOf 函数 判断函数的原型在不在对象的原型链上 对象是否是由函数创建的 Object以外 只有创建当前的对象的构造函数是成立的 某个对象是不是某个数据类型(arr instanceOf Array arr是不是数组)

  4. Object.create(对象) 创建一个新对象,其隐式原型指向指定的对象

  5. 对象.hasOwnProprety(属性名) 判断某个属性是否是当前对象自身的属性 Object是所有构造函数的父类

如何判断一个对象是不是数组

  1. Array.isArray(对象)

  2. 对象.constructor === Array

  3. 对象 instanceof Array

  4. Object.prototype.toString.call(对象) === '[object Array]' // 验证最严格

  5. 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);

圣杯模式

封装继承方法

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值