2014-10-11 64 views
0

写到这代码只用于试验目的。在这里,我用Object.defineProperty创建一个名为'fullName'性质和使用set我定义的另一个属性叫middleName人。我不得不通过fullName。无论他们有枚举财产TRUE传递价值middleName,使for..in回路可以访问它。但是后来我想从删除中间名属性object.But它仍然是there.Why它仍然存在??为什么这个属性不希望被deleated

(function(){ 
 
    person = { 
 
    firstName: 'will', 
 
    lastName: 'Smith' 
 
    }; 
 

 
    Object.defineProperty(person,'fullName',{ 
 

 
    set:function(mid){ 
 
     Object.defineProperty(person,'middleName',{ 
 
     value  : mid, 
 
     enumerable: true, 
 
     writeable : false 
 
     }); 
 
    }, 
 
    get:function(){ 
 
     document.write(this.middleName); 
 
    }, 
 
    enumerable:true 
 
    }); 
 

 
    person.fullName='lol'; 
 
    person.fullName; \t 
 
    document.write(Object.getOwnPropertyNames(person)+'</br>'); \t 
 

 
    for(key in person){ 
 
    document.write(key+'</br>'); 
 
    } \t \t 
 

 
    document.write('\n'); \t \t 
 
    delete (person.middleName); 
 
    document.write(person.middleName+'</br>'); 
 

 
    for(key in person){ 
 
    document.write(key+'</br>'); 
 
    } 
 
})()

+0

'delete'操作者意图与**变量**一起使用。 'person.middleName +“
”'你试图删除是** **表达式是 – hindmost 2014-10-11 11:13:38

+0

是当我在编辑文章。它不包括在实际code.I打错了已编辑post.check它,请 – 2014-10-11 11:15:35

+0

@天诛地灭,我想你指的是[*删除*运算符(http://ecma-international.org/ecma-262/5.1/#sec-11.4.1)可以删除对象的属性,不变量(参见[ MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete))。 – RobG 2014-10-11 11:25:19

回答

2

当使用Object.defineProperty,所述可配置属性被默认设置为false(见ToPropertyDescriptor,步骤4),以使中间名属性不删除的。

注意,在:

delete (person.middleName); 

括号是冗余的,它应该被写成:

delete person.middleName; 

一个简单的例子是:

// Create object o 
var o = {}; 

// Define property a with value bar 
Object.defineProperty(o, 'a', { 
    value : 'bar' 
}); 

console.log(o.a); // bar 

// Since the configurable property of a was not set, it defaults to false 
// so it can't be deleted 
delete o.a; 

console.log(o.a); // bar 

// Create property b with value fum and configurable true 
Object.defineProperty(o, 'b', { 
    value : 'fum', 
    configurable: true 
}); 

console.log(o.b); // fum 

// Since b's configurable attribute is true, it can be deleted 
delete o.b; 

console.log(o.hasOwnProperty('b')); // false 
console.log(o.b); // undefined 
+0

很好的解释..感谢:) – 2014-10-11 18:54:56

相关问题