【问题标题】:Javascript: Property called "name" is blank in chrome/ff, not in IEJavascript:名为“名称”的属性在 chrome/ff 中为空白,而不在 IE 中
【发布时间】:2014-01-23 21:37:57
【问题描述】:

名称为“name”的属性声明始终是一个空字符串,无论我如何强制(硬编码)一个值。奇怪的是,这似乎只发生在 Chrome 和 Firefox 中。 IE 工作得很好,我什至没有为 IE 构建这个。

这里有一个小sn-p来重现这个问题:

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 .

【问题讨论】:

  • 很明显是因为obj是一个函数,而一个函数已经有name属性,它是内置在原型中的,即使你没有给函数起名字,你也可以'以后不要更改函数名称。
  • ^^ 是的,试试var obj = function lulz() {},你会看到“lulz”。
  • 它与 IE 一起工作的原因是因为 IE 很奇怪。 :)

标签: javascript internet-explorer google-chrome inheritance


【解决方案1】:

obj是一个函数,一个函数已经有一个name属性,它是内置在原型中的,即使你没有给函数命名,以后也不能更改函数名,它甚至在规范中

你不能改变函数的名字,这个属性是只读的:

MDN

如果它在 IE 中工作,那么 IE 是错误的。

【讨论】:

  • 我无意更改函数的整个名称。我只想拥有一个名为“name”的属性:(
  • @Harold - 但是对象是一个函数,它已经有一个 name 属性,它是你给函数的名字或一个空字符串,你不能改变它。您必须使用另一个属性或不是函数的对象。
  • 好吧,很高兴知道这对我来说不是一个奇怪的错误 :) 感谢您的回答。 (可在 3 分钟内标记为已接受)。
【解决方案2】:

name在某些浏览器中已经是函数的属性,

或 '' 表示匿名函数。

var obj = function testfun() {};
obj.name

/*  returned value: (String) testfun */

尽管您对对象创建语法不感兴趣,

一个对象(但不是一个函数)可以具有名称“测试”:

var obj2={};
obj2.name='test';

obj2.name
/*  returned value: (String) test */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多