无法定义 set 和 get 方法

Posted

技术标签:

【中文标题】无法定义 set 和 get 方法【英文标题】:Can't define set and get methods 【发布时间】:2017-02-23 02:43:51 【问题描述】:

尝试使用访问器定义属性时出现错误。这是我的代码

变种人 = ; Object.defineProperty(person, 'birthYear', 价值:1997, 可写:真, 可枚举:真, 可配置:假, 设置:函数(值) this.birthYear = 值; , 得到:函数() return '出生年份 - ' + this.birthYear; ); console.log(person.birthYear);

错误文本:

属性描述符无效。不能同时指定访问器和值 或可写属性。

如果我无法定义这样的 set 和 get 方法,我该怎么做?

【问题讨论】:

您会删除value,但您不想要一个检索this.birthYearbirthYear getter,因为这会产生无限递归。您需要将值存储在其他地方,例如不同的属性名称或符号,或变量中。 是否有理由在一个对象上定义属性,而不是the prototype ...仅供参考,您可以使用Object.create 一步完成该对象的创建/定义。 @SamOnela 因为没有在Object.prototype上安装任意属性,而且问题中的对象没有任何其他原型? 【参考方案1】:

查看错误信息:

不能同时指定访问器和值或可写属性。

当您明确说明尝试编写属性时会发生什么时,说属性是否可写是没有意义的。

所以删除:

    writable: true,

而且你不能给它一个值,当你读取它时动态计算的值,所以删除:

    value: 1997,

然后你会得到一个关于递归的错误,因为每次你尝试读取person.birthYear时,你的getter函数都会尝试读取person.birthYear

所以将值存储在其他地方。

var person =  _birthYear: 1997 ;

Object.defineProperty(person, 'birthYear', 
    enumerable: true,
    configurable: false,
    set: function (value) 
        this._birthYear = value;
    ,
    get: function() 
        return 'Birth year - ' + this._birthYear;
    
);

console.log(person.birthYear);

【讨论】:

以上是关于无法定义 set 和 get 方法的主要内容,如果未能解决你的问题,请参考以下文章

定义get/set方法快捷方式

关于java中get方法的问题..

php 魔术方法__get()和__set()理解

swift 基础小结02 -- VFL约束属性的get和set方法懒加载

PHP中的__get()和__set()方法获取设置私有属性

php中的__get和__set方法