zoukankan      html  css  js  c++  java
  • 重写prototype原型后哪些东西改变了

    参考《JavaScript高级教程》实例看:

    1.重写原型对象后,首先原型对象的constructor属性值(constructor的指向)会发生改变。

     function Person(){
            }
    Person.prototype={
        name:"nike",
        age:32,
        job:"write",
        sayName:function(){
            console.log(this.name);
        }
    };
    
     var person5=new Person();
    
    console.log(person5.constructor==Person);
    console.log(person5.constructor==Object);

    这里重写了Person.prototype原型对象重写之后变成一个Object对象实例,当然里面的属性和方法即是Person.prototype的属性方法。

    里面没有显示的设置constructor属性,我们看一下constructor属性如何得来。

    现在,Person.prototype已经是一个Object实例对象了,而Object构造函数在创建之初会自动生成它的prototype原型对象,同时原型对象会自动获取一个constructor属性(指向构造函数Object)。所有的Object实例对象通过_proto_都会获得原型对象里的constructor属性。

    事情很明白了,当在读取person5.constructor属性时,按照原型链查找,最终在Object.prototype上找到constructor属性,它是指向Object构造函数的。

    所以我们最后看到的结果也应该是这样的

    console.log(person5.constructor==Person);//fasle
    console.log(person5.constructor==Object);//true


    如果不想因为重写prototype而改变了constructor的指向,那么就在重写的时候显式设置constructor属性的值。
    Person.prototype={
        constructor:Person,
        name:"nike",
        age:32,
        job:"write",
        sayName:function(){
            console.log(this.name);
        }
    };

    
    

     2.重写原型对象后,对实例对象通过_roto_访问原型对象的属性方法有影响。

    我们知道构造函数的prototype属性是用来指向原型对象的,现在重写Person.prototype属性意味着它指向了一个新的对象(称为新的原型对象),不再指向函数创建时生成的那个原型对象了。(感觉绕的话,看一下js的内存分配)

    在调用new Person()创建对象实例时,会有一个内部属性_proto_指向原型对象Person.prototype

    1)如果new Person()创建实例发生在重写Person.prototype之前,那么_proto_指向的是函数创建时生成的原型对象。

    2)如果new person()创建实例在重写Person.prototype之后,_proto_始终都是指向原型对象的,不过此时指向的是改写后的新原型对象。

     情况1:
           function Person(){
            }
            var person5=new Person();
    
            Person.prototype={
                constructor:Person,
                name:"nike",
                age:32,
                job:"write",
                sayName:function(){
                    console.log(this.name);
                }
            };
            person5.sayName();//TypeError: person5.sayName is not a function
    

     输出结果:TypeError: person5.sayName is not a function

     情况2:

           function Person(){
            }
    
            Person.prototype={
                constructor:Person,
                name:"nike",
                age:32,
                job:"write",
                sayName:function(){
                    console.log(this.name);
                }
            };
            var person5=new Person();
    
            person5.sayName();

     输出结果:nike

    在实际应用中用的是情况2.

  • 相关阅读:
    OCP-052考试题库汇总(35)-CUUG内部解答版
    OCP-052考试题库汇总(34)-CUUG内部解答版
    018 ThreadLocal实现线程安全
    017 无锁与CAS
    016 原子类
    015 可见性问题与volatile
    014 锁重入
    013 synchronized的优化
    012 内置锁和synchronized
    011 线程安全性问题
  • 原文地址:https://www.cnblogs.com/web-coding/p/4723381.html
Copyright © 2011-2022 走看看