2017-05-24 76 views
-1

在下面给出的第一个代码中,对象为book,开头的book.year设置为2013。当我分配book.year = 2015并再次尝试通过执行book.year来检索其值时,我仍然得到2013而不是2015。我在哪里做错了?Object.defineProperties() - 在定义属性后为属性赋予新值

的代码如下给出:

var book = {}; 
Object.defineProperties(book, { 
    _yearOrigin: { 
     value: 2013 
    }, 
    edition: { 
     value: "1st" 
    }, 
    year: { 
     get: function(){return this._yearOrigin}, 

     set: function(newValue){ 
      //assigning this._yearOrigin 
      this._yearOrigin = newValue; 

      //carrying the operation for evaluating the `subscript` to add in this.edition 
      //diff = difference in year 
      var diff = String(newValue - 2013); 
      var diffLast2ndChar = diff.charAt(diff.length - 2); 
      var diffLastChar = diff.charAt(diff.length - 1); 
      var subscript = ""; 

      if (diff.length > 1 && diffLast2ndChar == "1") { 
       subscript = "th"; 
      } else { 
       subscript = diffLastChar == "1" 
           ? "st" 
           : diffLastChar == "2" 
            ? "nd" 
            : diffLastChar == "3" 
             ? "rd" 
             : "th" ; 
      } 
      //--end of subscript evaluation 

      //assigment operation of this.edition 
      var rawEdition = Number(this.edition.charAt(0)) + Number(diff); 
      this.edition = String(rawEdition) + subscript; 
     } 
    } 
}); 

>>> book.year = 2015 
>>>book.year //output is 2013 , but expected output is 2015 

然而,在另一方面,在当尝试检索的book2.year的值,低于给定的分配book2.year = 2013后另一当量一段代码,给出预期

输出 2013
var book2 = { 
    _year: 2004, 
    edition: 1 
}; 
Object.defineProperty(book2, "year", { 
    get: function(){ 
     return this._year; 
    }, 
    set: function(newValue){ 
     if (newValue > 2004) { 
      this._year = newValue; 
      this.edition += newValue - 2004; 
     } 
    } 
}); 

book2.year = 2005; 
console.log(book2.year); //2005 (Now this time the output is expected unlike in the previous code shown above) 
+2

在第一部分要设置你的'_yearOrigin'到'2013'的值作为常数值。由于您只给出[value](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)参数,因此将其视为不可变的值。在第二个版本中,您定义了一个对象的属性,默认值为“2004”。有一个很大的差异 – Icepickle

+2

由'defineProperties()'与'value'创建的属性,比如'_yearOrigin',默认为非['可写入]](https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties)(不可变)。 –

+0

@Ipickle @Jonathan我该怎么办?我是否需要指定'writable:true'或其他? – Neel

回答

0

我忽略了一个事实,即“使用Object.Property/Object.properties当定义一个对象的属性,默认writablefalse,我。 e,定义的值不能改变(不可写)“这是评论部分中的人提到的。

当我加入writable = true如下图所示,那么问题得到有效解决和预期的结果弹出

_yearOrigin: { 
    value: 2013, 
    writable: true 
}, 
+1

不要忘记,现在这也意味着它可以从代码的任何部分进行设置,而在开放问题中,您使用它更像是私有属性。这意味着在你的代码中,你不能再确定_yearOrigin是真正的原点,还是已经设置好了,而没有在你的单独设置器中进行检查 – Icepickle