素材牛VIP会员
js原型和继承的问题?
 Fo***ou  分类:JavaScript  人气:1167  回帖:2  发布于6年前 收藏
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)垃圾回帖将一律封号处理……

Lv3 码奴
懒***材 职业无 6年前#1

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

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后就没了。

Lv6 码匠
好***下 职业无 6年前#2

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

 文明上网,理性发言!   😉 阿里云幸运券,戳我领取