const func = function() {
this.name = 'mon'
}
let f1 = new func
let f2 = Object.create(f1)
let f3 = Object.create(f2) // The following comments are what the browser console logs:
console.log(f1.__proto__) // {constructor: f}
console.log(f2.__proto__) // func {name: "mon"}
console.log(f3.__proto__) // func {} (here's where this snippet logs func {"name": "mon"})
另外,对象中JS的“类型”是否由其“最近”构造函数确定?(即func是浏览器为f1
&记录的类型f2
)?
区别在于Stack Snippet控制台(可在此处找到其代码)使用迭代属性for..in
。这将包括原型链上任何位置的可枚举属性。这是代码片段控制台找出要记录的属性的方式(的一部分):
function n(e) {
var n = [];
for (var o in e)
n.push(o);
return n
}
例如:
const proto = { prop: 'val' };
const obj = Object.create(proto);
console.log(obj); // browser console shows `Object`, but no `prop` property
相反,在浏览器控制台中,将仅显示直接在已记录对象上的属性。为了访问所记录对象的内部原型(并查看原型上可能的属性),您必须单击该__proto__
属性以将其展开。
由于constructor
的属性someFunction.prototype
是不枚举,它不会被通过遍历for..in
,所以它在看到浏览器控制台,而不是在片段控制台。
const func = function() {
this.name = 'mon'
}
console.log(func.prototype.hasOwnProperty('constructor'));
for (const prop in func.prototype) {
console.log(prop); // Nothing is logged
}
另外,对象中JS的“类型”是否由其“最近”构造函数确定?(即func是浏览器为f1和f2记录的类型)?
每个对象只有一个内部原型。在您的代码段中,f3
isf2
的内部原型,f2
isf1
的内部原型和f1
is的内部原型func.prototype
。原型链中的某些内容也可能具有一个constructor
属性(func.prototype.constructor === func
),但实际上存在这种属性并不会对内部原型链产生任何影响,这只是将.prototype
对象链接至与其关联的便捷方法function
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句