function Person(){}
/*
Person.prototype.name = 'tanbin';
Person.prototype.age = 22;
Person.prototype.sayName = function(){alert(this.name);}
*/
字面量写法
Person.prototype={
name: 'tanbin',
age: 22,
sayName: function(){
alert(this.name);
}
}
var p1 = new Person();
p1.sayName(); //这里会出错吗?这种字面量的写法不是会产生这样的问题,new Person()时,返回的对象会有一个[[prototype]]指向原型对象,因为上面重写了Person的原型对象,但没有修改到原来的原型对象。所以p1是不会有sayName属性的。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
单词打错了
谁说p1 没sayName属性的 ?即使你重写Person原型,但是sayName仍然还在。sayName已经在原型链上。
重写Person原型后,Person.constructor 就指向Object。而Object下是有sayName属性的。
这种写法没有错误,不会报错,运行p1.sayName()会alert出“tanbin”,p1这个对象拥有prototype原型对象的所有属性和方法,只是p1.constructor变成了赋值给prototype对象({}字面量对象)的constructor,即function Object() { [native code] }。
说下我的见解,你每次改写person.prototype的时候其实都相当于将prototype指向一个新的地址,在你写了sayname方法后,以person为原型new出了一个新对象p1,这时候p1会继承person,p1的__proto__会指向person的prototype指向的地址。这个地址里有sayname方法。
然后当你再次重写person.prototype后,person.prototype指向了一个新地址,但这并不会改写p1.__proto__,所以p1中仍然总有sayname方法,但是因为p1.__proto__和person指向的地址不一样,所以p1已经和person没有关系了,这时候p1 instanceof person返回false。
说俗一点,一个父亲有了一个小孩,小孩继承了父亲的肤色,并且和父亲相同的姓,但是过了一会父亲改姓了,小孩不肯改,于是就决裂了,父子俩变成了两家人,但小孩的肤色并不会变。