我想在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'.lower
将null
这样。
我错过了什么吗?
答案 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)
两件事:
'EXAMPLE'.lower()
,那么getter不应该调用toLowerCase
函数,而是返回对该函数的引用,因为调用部分发生在{{1} }}:
.lower()
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!
的位置。拥有它们两次毫无意义。