区分 属性 和同名方法
Differentiate between property and method with same name
如果我有一个名为 format
的变量和一个同名的方法,我将如何调用变量和方法?
use strict;
function Time() {
this.format = 'x:y:z';
}
Time.prototype = {
format: function (format) {
}
}
您通常不能这样做,因为 方法 和包含 属性 的 JavaScript 没有区别a function——它们是完全一样的东西!您可以通过将函数分配给属性来创建方法。
在这种特殊情况中,您可以通过原型访问函数对象并将其应用于对象,但这是糟糕的 hack.
Time.prototype.format.apply(some_time_object);
最好将方法和值存储在不同名称的属性中。
函数实际上是存储在 JavaScript 属性中的对象,所以这是不可能的。
当您调用 instance.format()
时,解释器会查看实例以查看它是否有一个名为 format
的 属性。如果有,它会检查它是否是一个函数,如果不是则抛出错误。如果实例没有这样的 属性,它会检查实例的原型并做同样的事情,直到祖先有 format
属性 或直到它到达继承的顶部树。在你的情况下,它总是会尝试执行字符串,这会导致错误。解释器从不查看其 format()
方法的原型。
如果您愿意,可以将 属性 重命名为 formatString
或 mask
。
你不能这样做。唯一保留的 属性 将是字符串,该函数将不存在于任何实例化对象中。
要么以不同的方式命名它们,方法可以是 formatAs
,或者具有不带参数的函数 return 格式:
function Time() {
this.currentformat = 'x:y:z';
}
Time.prototype.format = function (format) {
if (typeof format === "undefined"){
return this.currentformat;
}
// ...
}
如果我有一个名为 format
的变量和一个同名的方法,我将如何调用变量和方法?
use strict;
function Time() {
this.format = 'x:y:z';
}
Time.prototype = {
format: function (format) {
}
}
您通常不能这样做,因为 方法 和包含 属性 的 JavaScript 没有区别a function——它们是完全一样的东西!您可以通过将函数分配给属性来创建方法。
在这种特殊情况中,您可以通过原型访问函数对象并将其应用于对象,但这是糟糕的 hack.
Time.prototype.format.apply(some_time_object);
最好将方法和值存储在不同名称的属性中。
函数实际上是存储在 JavaScript 属性中的对象,所以这是不可能的。
当您调用 instance.format()
时,解释器会查看实例以查看它是否有一个名为 format
的 属性。如果有,它会检查它是否是一个函数,如果不是则抛出错误。如果实例没有这样的 属性,它会检查实例的原型并做同样的事情,直到祖先有 format
属性 或直到它到达继承的顶部树。在你的情况下,它总是会尝试执行字符串,这会导致错误。解释器从不查看其 format()
方法的原型。
如果您愿意,可以将 属性 重命名为 formatString
或 mask
。
你不能这样做。唯一保留的 属性 将是字符串,该函数将不存在于任何实例化对象中。
要么以不同的方式命名它们,方法可以是 formatAs
,或者具有不带参数的函数 return 格式:
function Time() {
this.currentformat = 'x:y:z';
}
Time.prototype.format = function (format) {
if (typeof format === "undefined"){
return this.currentformat;
}
// ...
}