Javascript 删除实例本身上的操作,而不是创建实例的构造函数上的操作

Javascript 删除实例本身上的操作,而不是创建实例的构造函数上的操作,javascript,Javascript,对于delete关键字在JavaScript中的工作方式,我有点困惑 我有一个家长和一个人构造函数。我已经实例化了person1,并用person1.name=“newPerson”设置了它的name属性。如果我运行以下代码: delete Person.name 它将删除该属性。但是,person1.name仍然存在,并且console.log(person1.name)返回“newPerson”。相反,如果我 delete person1.name 将调用父对象的name属性并对其执行操

对于
delete
关键字在JavaScript中的工作方式,我有点困惑

我有一个
家长
和一个
构造函数。我已经实例化了
person1
,并用
person1.name=“newPerson”
设置了它的
name
属性。如果我运行以下代码:

delete Person.name
它将删除该属性。但是,
person1.name
仍然存在,并且
console.log(person1.name)
返回
“newPerson”
。相反,如果我

delete person1.name
将调用父对象的
name
属性并对其执行操作

在第一种情况下,
delete
不会从给定实例中删除属性,而是从
Person
构造函数中删除属性。在第二种情况下,
delete
Person
构造函数中删除属性以及从中创建的所有实例。我知道
delete
不会影响JavaScript中的变量,例如
person1
;然而,在这种情况下,
delete
是如何工作的

function Person(){
    this.name = "person";
}
function Parent(){
    this.name = "parent";
}
Person.prototype = new Parent();

var person1 = new Person();
person1.name = "newPerson";

delete (Person.name);
console.log(person1.name);

javascript中的
delete
操作符主要用于从对象中删除属性。您不能删除javascript中的对象。因为它是一种垃圾收集语言,所以释放对象的方法是删除对它的所有引用(例如,所有有指向它的指针的变量)。删除对它的所有引用后,垃圾收集器将释放该对象

通过将任何对象的引用设置为
null
(或任何其他值)或等待变量超出范围,可以清除对该对象的引用

在您的具体示例中:

delete Person.name
不执行任何操作,因为
Person
是一个函数对象,而该函数对象没有名为
name
的属性。您询问的属性
name
似乎位于
Person
对象的实例上,该对象存储在
person1
变量中。所以,你可以这么做

delete person1.name
如果确实要从该特定对象中删除属性



另外,您关于从
原型中删除内容的评论对我来说没有意义。在任何一种代码情况下,都不会从原型中删除任何内容。

javascript中的
delete
操作符主要用于从对象中删除属性。您不能删除javascript中的对象。因为它是一种垃圾收集语言,所以释放对象的方法是删除对它的所有引用(例如,所有有指向它的指针的变量)。删除对它的所有引用后,垃圾收集器将释放该对象

通过将任何对象的引用设置为
null
(或任何其他值)或等待变量超出范围,可以清除对该对象的引用

在您的具体示例中:

delete Person.name
不执行任何操作,因为
Person
是一个函数对象,而该函数对象没有名为
name
的属性。您询问的属性
name
似乎位于
Person
对象的实例上,该对象存储在
person1
变量中。所以,你可以这么做

delete person1.name
如果确实要从该特定对象中删除属性


另外,您关于从
原型中删除内容的评论对我来说没有意义。在两种代码情况下,都不会从原型中删除任何内容。

通过执行
删除(Person.name)
您试图删除函数
Person
的属性,该属性确实存在(不可配置属性)。它与其实例上的
name
属性无关。 如果您执行
console.log(删除(Person.name))您将看到它。其唯一目的是从对象中删除属性。“是”函数可以具有属性,例如:-

function Person(){
   this.name='person'; //Available on the instance of Person or on any of the prototype chain it belongs to
}

Person.refName = "something"; //This is not on the instance of the Person
您可以删除:-

delete (Person.refName)
删除仅对对象的属性有效。它对变量或函数名没有影响

如果要从对象中删除属性,只需从其实例中删除,例如:-
delete person1.name

执行
delete(Person.name)
您试图删除函数
Person
的属性,该属性确实存在(不可配置属性)。它与其实例上的
name
属性无关。 如果您执行
console.log(删除(Person.name))您将看到它。其唯一目的是从对象中删除属性。“是”函数可以具有属性,例如:-

function Person(){
   this.name='person'; //Available on the instance of Person or on any of the prototype chain it belongs to
}

Person.refName = "something"; //This is not on the instance of the Person
您可以删除:-

delete (Person.refName)
删除仅对对象的属性有效。它对变量或函数名没有影响


如果要从对象中删除属性,只需从其实例中删除,例如:-
delete person1.name

这似乎与他的问题无关。他没有试图删除实例,他只是混淆了实例中的
name
属性与原型链之间的关系。@Barmar-第一部分是背景-我已经填写了更具体的内容,我正在编写更多内容。现在还不清楚OP到底想做什么。我试图解释一下
delete
操作符的一般用法,以及它如何应用于OP的对象。Person.hasOwnProperty(name)返回false,但person1.hasOwnProperty(name)返回true。为什么Person构造函数上没有name属性??如果Person构造函数上没有name属性,那么这个.name='Person'语句是什么意思呢?谢谢。我对面向对象的JS概念非常陌生。我试图澄清一些令人困惑的术语:)@user3138436@user3138436-
this.name='Person'
正在将名为
name
的属性添加到该
指向的任何对象中(在您的情况下,该对象是由
父对象
构造创建的新对象