2015-05-11 24 views
1

有沒有一種公認的習慣用JavaScript來獲取自己的對象?即在IE10及以上版本中,我想砍掉一個對象的原型鏈。成語只獲取「自己的對象」而不是原型鏈

function O() { 
    this.foo = 'foo'; 
} 
O.prototype = { bar: 'bar' } 

var o = new O(); 

for(var v in o) { 
    console.log(v); // foo bar 
} 

// ...but I just want an object representing the own properties and their values 

o.__proto__ = null; // But I need this to work in IE10 
for(var v in o) { 
    console.log(v); // foo 
} 

回答

1

你可以使用Object.getOwnPropertyNames()Object.keys()

Fiddle demo

function O() { 
    this.foo = 'foo'; 
} 
O.prototype = { bar: 'bar' } 

var o = new O(); 

for(var v in o) { 
    console.log(v); // foo bar 
} 

Object.getOwnPropertyNames(o).forEach(function(val, idx, array) { 
    console.log("getOwnPropertyNames() " + val); 
}); 

Object.keys(o).forEach(function(val, idx, array) { 
    console.log("keys() " + val); 
}); 
2

您可以使用hasOwnProperty排除原型屬性:

for(var v in o) { 
    if (o.hasOwnProperty(v)) { 
    console.log(v); // foo 
    } 
} 

或者使用Object.keys僅檢索實例屬性:

var props = Object.keys(o); 
console.log(props); //=> ['foo'] 

爲了能夠使用或不使用原型對於一個som構造函數,您可以爲該構造函數創建一個工廠函數,類似於(在IE10中進行測試和工作):

function OFactory(useproto) { 
 
    
 
    function O() { 
 
    this.foo = 'foo'; 
 
    } 
 
    
 
    O.prototype = useproto; 
 
    return new O; 
 
    
 
} 
 

 
var o = OFactory({bar: 'bar'}); 
 
var p = OFactory(); 
 
var q = OFactory({bar: 'bar', foox: 'foox', fooy: 'fooy'}); 
 

 

 
for (var l in o) { 
 
    log('o['+l+']'); 
 
} 
 

 
for (var l in p) { 
 
    log('p['+l+']'); 
 
} 
 

 
for (var l in q) { 
 
    log('q['+l+']'); 
 
} 
 
    
 
function log(str) { 
 
    var res = document.querySelector('#result'), 
 
     current = res.textContent; 
 
    res.textContent = [current, str].join('\n'); 
 
}
<pre id="result"></pre>

+0

你有一個 「!」太多了。現在它只記錄原型屬性。 – Jordumus

+0

好的,在IE10中直接操作鏈是不可能的? – Ben

+0

@Jordumus,你是對的,刪除它。 – KooiInc

1

我不知道的一個直接的方式只得到沒有原型鏈的對象,但你可以改變你的循環,因此在跳這些元素:

for(var v in o) { 
    if (o.hasOwnProperty(v)) { 
     //Voodoo magic here. 
    } 
} 
2

你想看看Object.getOwnPropertyNames(),分別是Object.keys()。兩者的區別在於,getOwnPropertyNames也會列舉不可枚舉標記的屬性,而keys()將隱藏這些屬性。

Object.getOwnPropertyNames()方法返回直接在給定對象上找到的所有屬性(可枚舉或不可枚舉)的數組。

相關問題