删除运算符不适用于原型属性

时间:2018-07-22 07:32:31

标签: javascript function

删除操作符可用于除原型外的所有属性...

function Foo(name){
    this.name = name;
}

Foo.job = "run";
console.log(Foo.job);//run
console.log(Foo.prototype);//Foo{}

//deleting the properties using the delete operator
console.log(delete Foo.job);//true
console.log(delete Foo.prototype);//false

console.log(Foo.job);//undefined
console.log(Foo.prototype);//Foo{} ???????????????????????

为什么delete运算符不能与prototype属性一起使用?预先感谢

2 个答案:

答案 0 :(得分:1)

如果检查Foo.prototype的属性描述符,则会发现它是non-configuarble,这意味着它不能被删除:

function Foo(){}

console.log(Object.getOwnPropertyDescriptor(Foo,'prototype'))

此外,一旦将属性上的configurable设置为false,就不能将其设置回true。因此,无法从函数中删除prototype。 (也很难想象有这样的用例。)

答案 1 :(得分:1)

内置prototype属性不是configurable属性,因此无法删除。

function Foo(name){
    this.name = name;
}

console.log(
  Object
  .getOwnPropertyDescriptor(Foo, 'prototype')
  .configurable
);

显式添加的属性(例如您示例中的job)通常是可配置的,

function Foo(name){
    this.name = name;
}
Foo.job = 'run';

console.log(
  Object
  .getOwnPropertyDescriptor(Foo, 'job')
  .configurable
);

每个MDN可配置:

  

当且仅当可以更改此属性描述符的类型并且可以从相应对象中删除该属性时,才为true。

不过,您可以使用Object.defineProperty定义一些不可配置的属性:

function Foo(name){
    this.name = name;
}
Object.defineProperty(
  Foo,
  'job',
  {
    value: 'foo',
    configuable: false
  }
)
delete Foo.job;
console.log(Foo.job);