js原型和继承的问题?

function Person(name,age){
  this.name = name;
  this.age = age;
}
 
Person.prototype.getAge = function(){
  return this.age;
}
Person.prototype.getName = function(){
  return this.name;
}
 
var p = new Person("Nicholas",18);
console.log(p.constructor === Person.prototype.constructor)// true 

因为 p.constructor回去找p.__proto__中的值,而 p.__proto__ 由 Person.prototype而来,所以相等

function Person(name,age){
  this.name = name;
  this.age = age;
}
 
Person.prototype = 1
 
var p = new Person("Nicholas",18);
console.log(p.constructor); //ƒ Object() { [native code] }

为什么不是 Person.prototype.constructor的Number,而是object
而且 p.constructor === Person.prototype.constructor也返回false

阅读 2.5k
2 个回答

Person.prototype 如果不是对象,就会设置 p 的原型为 Object构造函数。

对于你改完的代码我们可以一步步看,

function Person(name,age){
  this.name = name;
  this.age = age;
}

我们可以log下这个Person.prototype,发现是个object,里面有constructor和__proto__,前者对应的默认是你函数本身,后者是继承Object得来的。
然后

Person.prototype = 1

此时Person的prototype被你赋值成了1,是个数字,数字本身的constructor当然是继承Number对象的。
但是此时Person本身是没有发生改变的,你只是改变了他的prototype属性。
然后

var p = new Person("Nicholas",18);

new了一个p,因为在new之前你已经改变了Person的prototype,所以原本属于prototype的constructor没有被p继承下来。那么p的constructor只能是从Object里拿的了,也就是最顶层的。
我们可以通过log(p)比较改Person.prototype 和不改Person.prototype ,对生成的p的影响。
不改

//...
consolg.log(p);//{name:'Nicholas',age:'18',__proto__:{constructor:Person(namn,age){...};__proto__:{constructor:Object(),...}}}

//...
consolg.log(p);//{name:'Nicholas',age:'18',__proto__:{constructor:Object(),...}}

很明显少了一层__proto__,这一层__proto__里constructor的就是原本通过Person.prototype.constructor传下来的,但是Person.prototype被改成1后就没了。

推荐问题
宣传栏