原型和原型链

2020 M12 22

核心概念

原型相关概念:构造函数,原型对象,实例对象

function Person() { }
var p = new Person()
//  上述代码 构造函数就是Person,原型对象是Person.prototype,实例对象是p
//  三者关系是
// new Person =>得到实例对象
// 实例对象p的constructor属性指向该构造函数Person 
// p.constructor===Person true
// 实例对象p的属性__proto__  指向 Person.prototype  
// p.__proto__===Person.prototype true
// 原型对象Person.prototype的constructor属性指向构造函数 
// Person Person.prototype.constructor===Person true
// 构造函数Person的prototype属性指向Person.prototype
//  每一个实例的__proto__ 都会对应一个原型对象
//  而这个原型对对象也是某个构造函数的实例
//  由此构成一条完整的原型链
//  一直到Object.prototype 它的 __proto__属性为null
p.__proto__ === Person.prototype// true
p.__proto__.__proto__ === Object.prototype// true
Object.prototype.__proto__ === null // true

实现一个new 操作符

function mynew(fn, ...args) {
    var obj = Object.create(fn.prototype)
    var res = fn.apply(obj, args)
    return res instanceof Object ? res : obj;
}

实现一个object.create

function create(proto) {
    function F() { }
    F.prototype = proto
    return new F()

}

实现一个instanceof

function myinstanceof(instance, constructor) {

    while (instance) {
        if (instance === constructor.prototype) return true
        instance = instance.__proto__
    }
    return false
}