2014-01-23 71 views
0

對名稱爲「name」的屬性的聲明始終是一個空字符串,無論我強制(硬編碼)多少值它。奇怪的部分是,這隻會在Chrome和Firefox中出現。 IE的工作原理非常好,我甚至沒有爲IE創建過這個功能。Javascript:名稱爲「name」的屬性在chrome/ff中爲空,而不是在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

這顯然是因爲'obj'是一個函數,並且函數已經具有'name'屬性,即使您沒有給該函數一個名稱,它也會內置到原型中,並且以後不能更改函數名稱。 – adeneo

+0

^^是的,試試'var obj = function lulz(){}',你會看到「lulz」。 – elclanrs

+2

[爲什麼我無法設置JavaScript函數的名稱屬性?](http://stackoverflow.com/questions/18904399/why-cant-i-set-a-javascript-functions-name-property) – Bergi

回答

2

obj是功能,和功能已經具備了name屬性,它的建成爲原型,即使你沒有給函數的名稱,你以後不能改變一個函數名稱「即使是在規範

你不能改變一個函數的名S,該屬性爲只讀:

MDN

如果它工作在IE,那麼IE是錯誤的。

+0

我不打算改變一個函數的全名。我只想要一個名爲「name」的屬性:( – Harold

+1

@Harold - 但是該對象是一個函數,它已經有一個名稱屬性,它是您給該函數的名稱或一個空字符串,並且您不能更改你必須使用另一個屬性或一個不是函數的對象 – adeneo

+0

好吧,很高興知道這不是一個奇怪的錯誤,然後我的結束:)謝謝你的答案。 (可以標記爲3分鐘內接受)。 – Harold

1

已經是匿名函數在某些瀏覽器功能的屬性,

或「」。

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

/* returned value: (String) testfun */ 

而且儘管創建對象的語法,請uninterest,

對象(而不是功能)可以有名稱爲 '測試':

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

obj2.name 
/* returned value: (String) test */ 
相關問題