使用defineProperty for String的Javascript getter返回null

时间:2016-10-04 10:11:36

标签: javascript oop

我想在Javascript中为String对象定义一个简单的getter。我曾经做过以下事情: String.prototype.__defineGetter__("lowerCase", function() { return this.toLowerCase(); });

因此,'EXAMPLE'.lower会返回'example'

然而,__defineGetter__方法得到了贬低。我试着这样做:

Object.defineProperty(String, "lower", {
  get: function () {
    return this.toLowerCase();
  }
});

但是,'EXAMPLE'.lowernull这样。

我错过了什么吗?

3 个答案:

答案 0 :(得分:1)

替换第一行

Object.defineProperty(String, "lower", {

通过

Object.defineProperty(String.prototype, "lower", { //notice that you are making a change in prototype rather than String directly.

答案 1 :(得分:1)

使用DECLARE @StartDate Datetime DECLARE @EndDate Datetime CREATE TABLE #tMyCalanderDate (dtDate Datetime Primary key) SELECT @StartDate = '01-Sep-2016' SELECT @EndDate = '30-Sep-2016' WHILE @StartDate <= @EndDate BEGIN INSERT INTO #tMyCalanderDate (dtDate) SELECT @StartDate SELECT @StartDate = DATEADD(day,1,@StartDate) END SELECT count(A.UserID) As [Count] , B.dtDate As [Date] FROM Users AS A RIGHT JOIN #tMyCalanderDate AS B ON CONVERT(date, A.AddDate) = CONVERT(date, B.dtDate) WHERE CONVERT(date, A.AddDate) BETWEEN @StartDate AND @EndDate Group By CONVERT(date, B.dtDate) 代替String.prototype。你这样做的方式,它将返回String,这没有意义。必须在原型上而不是在类上定义getter,就像您第一次使用String.toLowerCase()时所做的那样。

答案 2 :(得分:0)

两件事:

  • 您应该在原型上定义getter
  • 如果您打算用括号写'EXAMPLE'.lower(),那么getter不应该调用toLowerCase函数,而是返回对该函数的引用,因为调用部分发生在{{1} }}:

.lower()

在getter中执行Object.defineProperty(String.prototype, "lower", { get: function () { return this.toLowerCase; } }); console.log('EXAMPLE'.lower());的替代方法:

您应该只调用一次函数toLowerCase。如果你打算写toLowerCase,那么这些括号意味着你在那里调用它,那么你不应该在你的getter中调用它。如果你这样做,getter将返回结果字符串,并将'EXAMPLE'.lower()应用于该字符串将返回错误。那时()不是方法,而是非功能属性。

因此,您可以将lower定义为非函数属性,然后不应将其称为函数。所以这也有效:

lower

请注意,在两个解决方案中,括号只出现一次 - 即您调用Object.defineProperty(String.prototype, "lower", { get: function () { return this.toLowerCase(); // <-- call it here } }); console.log('EXAMPLE'.lower); // <-- but then don't call it here!的位置。拥有它们两次毫无意义。