一. delete概述
先看下面的一些delete的操作:
//删除全局变量
str = "nihao";
console.log(delete str); //true
console.log(str); //报错
//删除对象成员
var obj = {
name: 'lihua',
age: 33
};
console.log(delete obj.name); //true
console.log(obj.name); //undefined
//删除数组元素
var array = [1, 2, 3,4];
console.log(delete array[2]); //true
console.log(array[2]); //undefined
//删除var声明变量
var hello = "nihao";
console.log(delete hello); //false
console.log(hello); //nihao
由上面的输出可以得出结论,delete运算符可以删除全局变量,数组元素,对象成员,不能删除var声明的变量和对象。
二. delete删除继承自原型的成员
(1)删除自身的成员
function Person(){
this.name = "李明";
}
var p = new Person();
console.log(p); //Person {name: "李明"}
delete p.name;
console.log(p.name); //undefined
console.log(p); //Person {}
可以看出成功删除了Person构造函数的实例p的成员。
(2)删除继承自原型的成员
function Person(){
this.name = "李明";
}
Person.prototype.age = 22;
function Student(){
}
Student.prototype = new Person();
Student.prototype.score = 99;
var p = new Person();
console.log(delete p.age); //true
console.log(p.age); //22
var s = new Student();
console.log(delete s.name); //true
console.log(delete s.score); //true
console.log(delete s.age); //true
console.log(s.name); //李明
console.log(s.age); //22
console.log(s.score); //99
由上述的输出可以看出,delete不能删除继承自原型的成员,也不能删除继承自原型的成员。
由上述的两个输出可以看出,delete运算符可以删除对象的实例中的成员,但是不能删除继承自原型的成员。
如果非要删除继承自原型的成员,可以让实例指向原型对象,然后去删除原型对象中的成员,这样一来会影响到继承自这个构造函数或者由这个构造函数实例化出来的所有对象。如下:
var p1 = new Person();
var p2 = new Person();
var s = new Student();
console.log(delete p.constructor.prototype.age); //true
console.log(p1.age); //undefined
console.log(p2.age); //undefined
console.log(s.age); //undefined
可以看出,每个实例的原型链共同经过的原型对象中的成员改变,每个实例都会受到影响。
在上面的代码中,如果要删除s的name成员:
console.log(delete s.constructor.prototype.name); //true
console.log(s.name); //李明
可以看出并没有成功删除,因为s.consturctor所指的构造函数是Person,并不是Student,所以应该是:
console.log(delete s.__proto__.name); //true
console.log(s.name); //undefined
由代码可以看出,不管成员删除是否成功都会返回true,查资料说只有在删除一些不能删除的成员时才会返回false,比如Function对象的length
,arguments等属性时。