博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译]因扩展Object.prototype而引发Object.defineProperty不可用的一个问题
阅读量:6106 次
发布时间:2019-06-21

本文共 1066 字,大约阅读时间需要 3 分钟。

原文:


从邮件列表中看到的.

Object.prototype.get = function(){};var o = {};Object.defineProperty(o, "hoge", { value: "OK" });// TypeError: property descriptors must not specify a value or be writable when a getter or setter has been specified

问题描述就是:如果在Object.prototype上添加了名为get,set之类的属性的话,再执行Object.defineProperty()的时候就很有可能发生问题.为什么?

不应该在Object.prototype上添加的属性

下面给出的属性名最不应该添加在Object.prototype上

  • get
  • set
  • value
  • writable

为什么?

Object.defineProperty的第三个参数Descriptor是个对象,指定了所定义属性的属性描述符.属性描述符一共有两种.数据属性描述符(DataDescriptor)和访问器属性描述(AccessorDescriptor).

数据属性描述符对象上不能有get,set属性,访问器属性描述符对象上不能有value,writable属性.

执行defineProperty的时候,在判断属性描述符对象中某个属性是否存在时使用的内部方法是[[HasProperty]].[[HasProperty]]会在[[Prototype]]上寻找属性,也就找到了Object.prototype上定义的那些属性.如果使用[[GetOwnProperty]]来判断的话就不会有这样的问题了.

上例中的问题就是,get和value两个属性不能同时存在,否则会报错.

解决办法

创建一个没有原型的属性描述符对象:

var des = Object.create(null);des.value = 123;Object.defineProperty(obj,"key",des);

也可以使用非标准的魔法属性__proto__:

Object.defineProperty(obj, "key", {  __proto__: null,   value: 123 });

同样,Object.defineProperties()以及Object.create()的第二个参数中也有属性描述符对象,也有可能出现同样的问题.

转载地址:http://qbhza.baihongyu.com/

你可能感兴趣的文章
微信小程序开发-框架
查看>>
redo、undo、binlog的区别
查看>>
DropDownList 控制日期控件显示格式
查看>>
RecycleView设置顶部分割线(记录一个坑)
查看>>
【设计模式系列】单例模式的7种写法
查看>>
汉字转拼音 (转)
查看>>
Machine Learning Techniques -6-Support Vector Regression
查看>>
会计基础_001
查看>>
Cordova 开发环境搭建及创建第一个app
查看>>
ajax请求拿到多条数据拼接显示在页面中
查看>>
小程序: 查看正在写的页面
查看>>
dedecms生成文档数据库崩溃 mysql daemon failed to start
查看>>
Linux的50个基本命令
查看>>
Objective-C中创建单例方法的步骤
查看>>
[转]无法安装MVC3,一直卡在vs10-kb2483190
查看>>
Codeforces 520B:Two Buttons(思维,好题)
查看>>
web框架-(二)Django基础
查看>>
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
Excel到R中的日期转换
查看>>