美文网首页
原型链和原型基础必知(一)

原型链和原型基础必知(一)

作者: 欢欢小天使K | 来源:发表于2020-03-31 15:53 被阅读0次
image.png image.png

创建对象的三种方式:

 // 字面量
    var o1 = { name: 'o1'};

    var o2 = new Object({ name: 'o2'})
    // 通过构造函数
    var M = function(name){ this.name = name;}
    var o3 = new M('o3');
    // Object.create
    var p = { name: 'o4'};
    var o4 = Object.create(p)
    //o4是不能直接拿到name属性的,是用原型链来连接的,o4的__proto__指向 的就是p对象

关于原型对象:

    /**
     * 任何函数都可以用来当做构造函数,加一个new;
     * 声明一个函数时,js引擎会自动加一个prototype
    **/
    //打印true: o3.constructor === M.prototype.constructor === M  
    //打印true: o3.__proto__ === M.prototype

    //如果多个构造函数增加属性或方法,会浪费空间;而原型对象的属性和方法是可以共享的,故可以利用原型对象增加属性或方法,直接通过原型链继承即可。
    
    M.prototype.say = function(content){ console.log(content) }
    o3.say('o5')
    //只有函数才有prototype,实例对象是没有的
    //只有实例对象才有__proto__,原型对象是没有的
    //函数也有__proto__,因为函数也是一个对象, 打印true: M.__proto__ === Function.prototype

instanceOf的原理:实例对象的属性和构造函数的属性判断是不是同一个引用;但是:原型对象有可能还会有他的构造函数,instanceOf返回还是true

        //打印true: o3 instanceof M
    //打印true: o3 instanceof Object
    //原因:
    //打印true: o3.__proto__ === M.prototype
    //打印true: M.prototype.__proto__ === Object.prototype

所以,用instanceof无法准确判断实例的原型是什么,如需要验证,要用constructor

    //打印false: o3.__proto__.constructor === Object
    //打印true: o3.__proto__.constructor === M

相关文章

网友评论

      本文标题:原型链和原型基础必知(一)

      本文链接:https://www.haomeiwen.com/subject/fonwuhtx.html