Javascript:名称为“name”的属性在chrome / ff中为空,而不是在IE中

时间:2014-01-23 21:37:58

标签: javascript internet-explorer google-chrome inheritance

名称为“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

2 个答案:

答案 0 :(得分:2)

obj是一个函数,函数已经具有name属性,它内置于原型中,即使您没有给函数命名,也无法更改函数名称稍后,它甚至在规范

  

您无法更改函数的名称,此属性为只读:

MDN

如果它在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 */