首页 > JavaScript中关于重写原型的问题,是如何指向的的?

JavaScript中关于重写原型的问题,是如何指向的的?

function Person(){
}

Person.prototype={   
        constructor:Person,
        name:"TIMY",
        age:77,
        job:"NEWS",
        sayName:function(){
            alert(this.name)}
};

var friend =new Person();
friend.sayName();  //输出'TIMY'

function Person(){
}
var friend =new Person();

Person.prototype={   
        constructor:Person,
        name:"TIMY",
        age:77,
        job:"NEWS",
        sayName:function(){
           alert(this.name)}
};

friend.sayName();  //error
  1. 书上说,“重写整个原型后,构造函数与最初的原型就切断了联系,而实例的指针仅指向原型,而不指向构造函数”。

    我不明白,重写后的原型中有sayName()这个方法,为什么调用不到,请问应该怎么理解这句话?

  2. 上面的两个函数为什么一个可以输出,一个是error?

楼上说了很多。。。。
其实问题的核心只有一点
就算你重写构造函数的原型后,实例的指针仍然指向其当初构造函数的原型
你进行重写后
你新原型的constructor属性指向Person,但是实例friend指向的原型仍然为Object.prototype
friend[[prototype]]隐式属性仍然为Object.prototype
你重写了构造函数的原型不等于实例也会和构造函数一起改变相应的指针
要知道关键字new才是进行一系列原型传递的信号,你有兴趣可以看看


兄弟,你弄错了。。。

function Person(){
}

Person.prototype={   
        constructor:Person,
        name:"TIMY",
        age:77,
        job:"NEWS",
        sayName:function(){
            alert(this.name)}
};

var friend =new Person();
friend.sayName();  

你的第一个例子能访问到sayName方法,是因为你定义了这个方法,并将实例friend的原型指针指向了构造函数的原型对象。

function Person(){
}
var friend =new Person();

Person.prototype={   
        constructor:Person,
        name:"TIMY",
        age:77,
        job:"NEWS",
        sayName:function(){
           alert(this.name)}
};

friend.sayName();  //error

你的第二个例子访问不到sayName方法,是因为实例friend没有这个方法。

那么问题来了,为什么没有这个方法呢?

因为在实例化的时候,你的firend的原型指针指向了构造函数的原型对象,这个的原型对象是空对象{} 

随后,你给构造函数附上了新的原型对象,即将构造函数指向新的原型对象,但是实例friend的原型指针依然还傻傻的指向原来的空原型对象{} (囧 没人理它)

这个时候你可以再实例化一个对象,它就会有sayName方法了~

就酱!

【热门文章】
【热门文章】