意外的“删除”返回值

时间:2016-01-05 14:31:03

标签: javascript

我有以下代码段,其中最后一次'删除'用法返回了一个意外的值。

function Shape() {
  this.a = 10;
}
Shape.prototype.a = 20;
var s = new Shape();
console.log(s.a); // 10
delete s.a; //true
console.log(s.a) // 20
delete s.a; //true
console.log(s.a); // 20

即使最后的'delete s.a'返回true,'s.a'的值仍然会返回20.

如果我们无法通过对象的引用(在本例中为's')删除原型上的对象,为什么delete关键字返回true?

其次,

delete Shape.prototype.a; // true

给出true,并且确实从Shape.prototype中删除了该属性。但有没有办法通过对象引用的'?

删除'Shape.prototype.a'

3 个答案:

答案 0 :(得分:3)

delete关键字的返回值表示删除操作是否确实删除了字段。来自MDN article about delete keyword

  

返回值

     

如果属性是不可配置的,则以严格模式投掷   property(非严格返回false)。在所有其他中返回true   例。

在您的情况下,s.a不是自己的属性,因此delete将始终返回true。如果在原型链中找到属性并不重要。例如:

delete {}.xyz; // also returns `true`.

您不应该改变原型,因为它会破坏JavaScript引擎为您提供的所有优化,以提高性能。但是,如果您真的想要,可以使用此功能:

function deepDelete(o,key) {
  while (o) {
    delete o[key];
    o = Object.getPrototypeOf(o);
  }
}

示例:

function S(){}
S.prototype.a = 8;
var s = new S();
s.a = 9;
console.log(s.a); // 9
delete s.a;
console.log(s.a); // 8
deepDelete(s, 'a');
console.log(s.a); // undefined

答案 1 :(得分:1)



function Shape() {
  //this.a = 10;
}

Shape.prototype.a = 20;
var s = new Shape();

console.log(s.a);

delete Shape.prototype.a;
console.log(s.a); 




引用MDN并在hege_hegedus的答案中也提到,

  

返回值

     

如果属性是不可配置的,则以严格模式投掷   property(非严格返回false)。在所有其他中返回true   例。

底线是删除是操作符而不是方法,它只是从对象中删除属性,aShape.prototype的属性而不是类{{1}的对象的属性},所以你需要删除它而不是Shape

答案 2 :(得分:0)

'delete'方法只能删除对象的属性,而不能删除prototype的属性。当你删除一个不存在于对象中的属性时,它将返回ture;但是下面的情况将返回false:

delete Object.prototype; //renturn false; property can't set
var x=1;
delete this.x; //return flase;can not delete a global var
function f(){}
delete this.f; //return false; can not delete a global function