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);
评论说像构造函数是人类,当取消评论它说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。我可以说构造函数在原型链中尽可能地走了吗?
答案 0 :(得分:2)
developer
没有名为constructor
的拥有属性,因此当您要求它时,它会在原型链中查找。由于原型是普通的Object,因此它的构造函数是默认的对象构造函数Object()
。
当您声明像function Human()
这样的新函数时,JS会创建一个隐式对象并填充prototype
和constructor
字段,如下所示:
X = {}
Human.prototype = X
X.constructor = Human
现在,当您撰写dev = new Human
时,__proto__
的内部dev
属性设置为X
,dev.constructor
解析为X.constructor
,这是Human
。
当您取消注释"披萨"行,代码变成以下内容:
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()
答案 1 :(得分:0)
返回对创建实例的Object函数的引用 原型。请注意,此属性的值是对该引用的引用 函数本身,而不是包含函数名称的字符串。该 value仅对原始值(如1,true和)是只读的 “测试”。
developer
的构造函数是function Human(){this.job = "code";}
。
由于您要将原型覆盖为对象,现在开发人员是Object {}
的实例。
控制台显示任何本地全局对象,在javascript本身的实现中预定义为[native code]
。那就是他们没有透露实施情况。