Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript defineProperty和Object.keys返回_Javascript_Defineproperty - Fatal编程技术网

Javascript defineProperty和Object.keys返回

Javascript defineProperty和Object.keys返回,javascript,defineproperty,Javascript,Defineproperty,我有一个先决条件,即使用object填充属性的空对象。定义属性。进退两难的是,我只想创建一个属性-[“prop1”],在上面的示例中,根据Object.keys()返回的内容,似乎创建了两个属性-[“prop1”,“_prop1”] 问题“prop1”的名称是什么?是属性还是伪属性? “prop1”和“_prop1”都使用name属性是否正确 我也尝试过这个解决方案: /** * @author paula */ var myObj = {}; Object.defineProperty(m

我有一个先决条件,即使用object填充属性的空对象。定义属性。进退两难的是,我只想创建一个属性-[“prop1”],在上面的示例中,根据Object.keys()返回的内容,似乎创建了两个属性-[“prop1”,“_prop1”]

问题“prop1”的名称是什么?是属性还是伪属性? “prop1”和“_prop1”都使用name属性是否正确

我也尝试过这个解决方案:

/**
 * @author paula
 */
var myObj = {};
Object.defineProperty(myObj, "prop1", {
           get: function(){return this._prop1;}, 
           set:function(value){this._prop1 = value;}, 
           enumerable:true});

Object.keys(myObj)    // Note that returns ["prop1"]
myObj.prop1 = "Hello"; // call set
Object.keys(myObj);    // Returns ["prop1", "_prop1"]
myObj          // Object {prop1: "Hello", _prop1: "Hello"}

并得到以下错误:“RangeError:超出了最大调用堆栈大小”,这是由于set在无限循环中反复调用相同的代码而触发的。我想知道对于这个“RangeError:Maximum call stack…”问题是否有解决方案?(可能重复)。谢谢。

当您在setter中执行此操作时:

var myObj1 = {};
Object.defineProperty(myObj1, "prop1", {
             get: function(){return this.prop1;}, 
             set:function(value){this.prop1 = value;}, 
             enumerable:true});
myObj1.prop1= "Bye" 
您正在创建“_prop1”属性。如果不希望它是可枚举的,请按以下方式定义:

this._prop1 = value;

在setter中执行此操作时:

var myObj1 = {};
Object.defineProperty(myObj1, "prop1", {
             get: function(){return this.prop1;}, 
             set:function(value){this.prop1 = value;}, 
             enumerable:true});
myObj1.prop1= "Bye" 
您正在创建“_prop1”属性。如果不希望它是可枚举的,请按以下方式定义:

this._prop1 = value;
问题:“prop1”的名称是什么?是属性还是伪属性?“prop1”和“_prop1”都使用name属性是否正确

是的,两者都是财产
prop1
是一个访问器属性(带有getter/setter),而
\u prop1
是一个数据属性(简单的可写值)

要解决您的问题,请不要使用访问者属性:

Object.defineProperty(myObj, "_prop1", { enumerable:false });
Object.defineProperty(myObj, "prop1", {
//  value: undefined,
    writable: true,
    enumerable: true
});
如果出于某种原因需要访问器属性,请将该值存储在闭包变量或不可枚举的“隐藏”属性中:

Object.defineProperty(myObj, "_prop1", { enumerable:false });
Object.defineProperty(myObj, "prop1", {
//  value: undefined,
    writable: true,
    enumerable: true
});

问题:“prop1”的名称是什么?是属性还是伪属性?“prop1”和“_prop1”都使用name属性是否正确

是的,两者都是财产
prop1
是一个访问器属性(带有getter/setter),而
\u prop1
是一个数据属性(简单的可写值)

要解决您的问题,请不要使用访问者属性:

Object.defineProperty(myObj, "_prop1", { enumerable:false });
Object.defineProperty(myObj, "prop1", {
//  value: undefined,
    writable: true,
    enumerable: true
});
如果出于某种原因需要访问器属性,请将该值存储在闭包变量或不可枚举的“隐藏”属性中:

Object.defineProperty(myObj, "_prop1", { enumerable:false });
Object.defineProperty(myObj, "prop1", {
//  value: undefined,
    writable: true,
    enumerable: true
});