在Javascript中,为什么在构造函数上设置原型会改变其实例上的.constructor值?

function Human(){
  this.job = 'code'
}

//Human.prototype = {feeds: 'Pizza'};

var developer = new Human();

console.log(developer.constructor);

控制台日志上方

function Human() {
this.job = 'code';
}

当我取消注释Human.prototype = {feeds:’Pizza’}时;它控制台日志

function Object() {
  [native code]
}

为什么在构造函数上设置原型,会影响谁是构造函数创建的对象的构造函数?

另一个例子:

function LivingBeing() {
  breathes: 'air';
}

function Human(){
  feeds: 'Pizza';
}

//Human.prototype = new LivingBeing();

var developer = new Human();
console.log(developer.constructor);

如评论所说构造函数是Human,当取消注释时它表示LivingBeing.为什么构造函数在原型上找到有效的东西时会进一步遍历?

我想再添加一个级别

function AThing(){
  this.say = function(){return 'I am thing';};
}

function LivingBeing() {
  breathes: 'air';
}

LivingBeing.prototype = new AThing();

function Human(){
  feeds: 'Pizza';
}

Human.prototype = new LivingBeing();

var developer = new Human();
console.log(developer.constructor);

现在它说开发人员的构造函数是AThing.我可以说构造函数在原型链中尽可能地走了吗?

最佳答案 开发人员没有自己的属性命名构造函数,因此当你要求它时,它在原型链中寻找.由于原型是普通的Object,因此它的构造函数是默认的对象构造函数Object().

当您声明一个像函数Human()这样的新函数时,JS会创建一个隐式对象并填充原型和构造函数字段,如下所示:

X = {}
Human.prototype = X
X.constructor = Human

现在,当你编写dev = new Human时,dev的内部__proto__属性设置为X,dev.constructor解析为X.constructor,即Human.

当您取消注释“pizza”行时,代码将变为以下内容:

Human.prototype = X
X.constructor = Human

pizza = {feeds:'Pizza'}
// pizza.__proto__ = {}
// pizza.constructor = pizza.__proto__.constructor = Object

Human.prototype = pizza
// note that pizza.constructor does NOT change

dev = new Human
// dev.__proto__ = Human.prototype = pizza

dev.constructor
// dev.constructor = dev.__proto__.constructor = pizza.constructor = pizza.__proto__.constructor = Object()
点赞