美文网首页饥人谷技术博客
JavaScript原型(初识)

JavaScript原型(初识)

作者: bob_play | 来源:发表于2017-03-05 22:17 被阅读0次

    原型本质:所有的构造函数都有一个prototype属性,该属性是指向函数的原型对象

    所有的实例都有一个_proto_属性,该属性指向产生实例对象的构造函数的原型

    _proto_不是标准属性,在Chrome,Safari,Firefox浏览器叫_proto_,在别的浏览器这个属性对脚本是不可见的, 实际上该属性是浏览器内部使用的,编程的时候不允许使用

    _proto_属性和构造函数中的prototype指向同一块区域.因此下面代码结果为true

    console.log(Person.prototype===p1.__proto__) //true
    

    原型的好处就是可以实现实例对象之间共享属性和方法

    function  Person(name,age){
        this.name = name;
        this.age = age;
    }
    
    Person.prototype.showName =function(){console.log(this.name);}
    Person.prototype.showAge =function(){console.log(this.age);}
    Person.prototype.arr = ['red','yellow'];
    var p1 = new Person('zhangsan',12);
    var p2 = new Person('lisi',13);
    p1.showName();
    p2.showName();
    console.log(p1.showName === p2.showName);//true
    
    prototype1.png

    我们在调用p1.showName()与p2.showName()时,解析器会问:实例p1中有showName属性吗?答案是:没有? 然后继续问:p1原型中有showName属性吗?答案是:有,因此就可以读取到在原型中的showName函数

    上边代码 给原型中的arr数组push新的值,如p1.arr.push('black');p1与p2访问到的值也是相同的

    prototype1.png

    注意
    如果写成p1.arr = ['pink'];相当于创建了一个新的属性,加到p1的实例对象,并没有加到原型中;
    因此获取p1.arr的值就是pink,在执行p1.arr的时候
    解析器会问:实例对象p1中有arr属性吗? 答案是:有 ,如果在实例对象中找到了具有给定名字的属性,那么就直接返回属性的值,如果没有找到才会到原型对象中找

    总结
    通过obj.arr =值;相当于创建了一个新的属性,加到obj中实例对象
    但是obj.arr.push(123);这种结构不会再obj中添加一个属性,而是在arr中添加了一个值

    相关文章

      网友评论

        本文标题:JavaScript原型(初识)

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