我有以下代码段,其中最后一次'删除'用法返回了一个意外的值。
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'答案 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 例。
底线是删除是操作符而不是方法,它只是从对象中删除属性,a
是Shape.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