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.

  • 相关阅读:
    Windows 8实例教程系列 开篇
    qt 开发发布于 windeploy.exe
    qt qoci 测试验证
    vmware vmx 版本不兼容
    qt oracle
    vc qt dll
    QOCIDriver unable to create environment
    qoci 编译完 放置位置 具体根据情况
    calling 'lastError' with incomplete return type 'QSqlError' qsqlquer
    Hbase 操作工具类
  • 原文地址:https://www.cnblogs.com/web-coding/p/4723381.html
Copyright © 2011-2022 走看看