名称为“name”的属性声明始终为空字符串,无论我多大程度地强制(硬编码)一个值。奇怪的是,这似乎只发生在Chrome和Firefox中。 IE工作得很好,我甚至没有为IE建立这个。
这是一个重现问题的小片段:
var fn = function() {
this.name = "Hello World"
this.foo = "bar"
}
// Create a blank function.
var obj = function() {};
// replacing the code below with 'var o = new fn()' doesn't make a difference.
var o = Object.create(fn.prototype);
fn.apply(o);
for (var i in o) {
// This line will print:
// name = Hello World
// foo = bar
console.log(i + ' = ' + o[i]);
// Apply them to the 'empty' function.
obj[i] = o[i];
}
console.log(obj.name); // prints ""
console.log(obj.foo); // prints "bar"
// Hardcode a value, just because I'm aggresive and frustrated.
obj.name = "test?"
console.log(obj.name); // still prints empty string :(
我对听取对象构造的替代方案不感兴趣,我只是想知道为什么这个特定的实现在Chrome和FF中不起作用,而在所有IE版本中都有效,包括11
答案 0 :(得分:2)
obj
是一个函数,函数已经具有name
属性,它内置于原型中,即使您没有给函数命名,也无法更改函数名称稍后,它甚至在规范
您无法更改函数的名称,此属性为只读:
如果它在IE中有效,那么IE就错了。
答案 1 :(得分:1)
名称已经是某个功能的属性
或''用于匿名函数。
var obj = function testfun() {};
obj.name
/* returned value: (String) testfun */
尽管您对对象创建语法不感兴趣,
一个对象(但不是一个函数)可以的名称为'test':
var obj2={};
obj2.name='test';
obj2.name
/* returned value: (String) test */