JavaScript语法澄清

时间:2015-12-28 13:00:22

标签: javascript

对于以下语法

    a = {
    get p() {
        alert(1)
    }
};
alert(a.p);

它提示我1,而不是undefined。 对于

a = {
    set p(x) {
        alert(x)
    }
};
alert(a.p);

它提示我未定义。

我不完全理解这种行为, 什么

a = {
    get p() {
        alert(1)
    }
}

and

a = {
    set p(x) {
        alert(x)
    }
};

意思?

4 个答案:

答案 0 :(得分:1)

因为p()方法没有返回任何内容因此返回undefined

如果你这样做

a={get p(){alert(1); return 2;}};
alert(a.p);

它将提醒1然后2,因为此p()方法已返回2

答案 1 :(得分:1)

[编辑] - 您更改了原始问题,因此此答案并未涵盖所有内容。

pgetter函数 - 只要您访问p属性,就会调用它。在getter alert(1) getter

p函数不返回任何内容。因此,undefinedalert(a.p)。因此undefined提醒a.p

因此,您的计划确实:

  • 获取alert(a.p)的价值:p
  • 调用alert(1) getter函数。哪个有p
  • alert(a.p) getter函数不返回任何内容
  • 因此undefined提醒{get p(){alert(1)}}

答案 2 :(得分:1)

p

这是一个getter a.p

的对象

当您使用alert(a.p);时,它将使用该getter来检索某些值

所以当你执行1时,它首先会调用getter,因此请提醒undefined,然后提醒返回的值WITH DataSource ([AccountId], [Type], [Amount]) AS ( SELECT [AccountId] ,'intractamt' ,Sum(amt) FROM tbl_LEDGER WHERE [GlCode] = 'INTRAC' GROUP BY AccountId UNION ALL SELECT AccountId ,'intlasAmt' ,Sum(amt) FROM tbl_LEDGER WHERE [GlCode] = 'INTLAS' GROUP BY [AccountId] ) SELECT [AccountId] ,[intractamt] ,[intlasAmt] FROM DataSource PIVOT ( MAX([Amount]) FOR [Type] IN ([intractamt], [intlasAmt]) ) PVT

答案 3 :(得分:1)

有两种类型的对象属性:data属性和accessor属性。
访问者属性由getterssetters访问。 您的对象a旨在作为具有名为p的访问者属性的对象。 通常,这些对象以下列方式声明:

a = {
    _p: 'my value', // intended as private
    get p() {
        return this._p;
    },
    set p(x) {
        this._p = x;
    }  
};

console.log(a.p);  // gives 'my value'
a.p = 'new value'; 
console.log(a.p);  // gives 'new value'

另一种方法是使用Object.defineProperty()方法,它允许您设置所有需要的属性属性。像这样:

var a = {p: 'my value'};
    Object.defineProperty(a, 'p', {
      get: function() { return this.p; },
      set: function(newValue) { this.p = newValue; },
      enumerable: true,
      configurable: true
});