重写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.

原文地址:https://www.cnblogs.com/web-coding/p/4723381.html