我明确定义了刚创建的对象的构造函数属性,如下所示:
var fooProto={foo:"prototype"};
function f(){ };
f.prototype=fooProto;
var object= new f();
object.constructor.prototype.bar="bar";
console.log(object.foo, Object.prototype.bar);
在控制台中我们有prototype,bar
,但我明确undefined,undifined
。请解释它为什么会发生?
答案 0 :(得分:1)
您正在向Object.prototype添加栏:
console.log(fooProto.constructor===Object);//true
console.log(object.constructor.prototype===fooProto);//true
设置f()
的原型后,你应该修复构造函数:
f.prototype=...;
f.prototype.constructor=f;
如果您期望未定义,未定义,那么我刚才回答为什么第二个不打印未定义。
为什么第一个未定义未在构造函数的介绍中回答here。简短的回答;当你在一个对象上请求成员并且该对象没有该成员/属性时,JS将在创建该对象的构造函数的原型上查找它。
例如:
var test = {};
console.log(test.hasOwnProperty);//=hasOwnProperty(), not undefined
测试没有hasOwnProperty所以它来自哪里?
console.log(test.constructor);//=Object()
console.log(test.constructor.prototype.hasOwnProperty
===test.hasOwnProperty);//=true
所以测试从Object.prototype得到hasOwnProperty而Object是测试的构造函数