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()