为什么我们不能更改内置函数构造函数的原型?

时间:2018-11-05 04:55:23

标签: javascript

String.prototype = {}; 
String.prototype;   //returns original value, i.e hasn't changed


function my_func(){}; 
my_func.prototype = {};   
my_func.prototype;  // returns {}, i.e has changed.

为什么String.prototype没有更改?

1 个答案:

答案 0 :(得分:3)

您无法更改它,因为specprototype的{​​{1}}属性是不可写的且不可配置的,它指出:

  

String.prototype
  String.prototype的初始值为固有对象%StringPrototype%。

     

此属性具有属性{[[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false)

您自己对象的原型 是可写的,您可以在String中看到:

Object.getOwnPropertyDescriptor()

可写的意思是:

  

可写
  当且仅当与该属性关联的值可以更改时才为true(仅数据描述符)。

您也无法将其设置为可写状态,因为它是不可配置的:

  

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

发件人:MDN

这并不意味着您不能更改原型对象,只是不能删除它或用其他东西代替它。例如,您可以添加到其中(不是我推荐这样做):

// String
console.log("String",
Object.getOwnPropertyDescriptor(String, 'prototype'))

// Custom Object
function my_func(){}; 
console.log("Your own object", 
Object.getOwnPropertyDescriptor(my_func, 'prototype'))