valueOf()/ toString()可以重写和继承吗?

时间:2014-09-16 14:43:25

标签: javascript inheritance

所以我正在进行个人研究,并试图更多地了解JavaScript继承等。我偶然发现了一个问题。检查代码。

var x = function() {}, y = 10;
x.valueOf = function() {
  return y + 10;   
}
x.prototype.valueOf = function() {
   return y + 5; 
}
var z = new x();
console.log(z, x); // x {valueOf: function} 20 
x.prototype.valueOf = x.valueOf;
var k = new x();
console.log(k, x); //x {valueOf: function} 20  the same!

我正在尝试进行无括号方法调用。我理解valueOf可以用于此,但toString也是如此。但是,使用toString,我console.log(z, x)的{​​{1}}结果不应该为20。

2 个答案:

答案 0 :(得分:1)

x.prototype.valueOf = x.valueOf;
var k = new x();
console.log(k, x); //x {valueOf: function} 20  the same!

当然,为什么不呢? k现在继承的valueOf函数与之前记录的z函数不同,但x.valueOf没有更改。

console.log调用自己的.valueOf()方法是非常奇怪的 - 请注意 console.log是非标准的而不是可靠的工具证明什么。更好:

function x() {}
x.valueOf = function() { return 20; };
x.prototype.valueOf = function() { return 15; };
var z = new x();
z.valueOf(); // 15
x.valueOf(); // 20
x.prototype.valueOf = x.valueOf;
var k = new x();
k.valueOf(); // 20
x.valueOf(); // 20

  

尝试进行无括号方法调用。

你可能想看看getter / setter。

  

我理解valueOf可用于此,但与toString

相同

是的,当对象被转换为原始值时,会自动调用valueOftoString - 例如当在其上使用数学运算符或使用字符串进行连接时。准确toValue和何时调用toString时的规则很难; more details here

示例:

z+x; // 35

答案 1 :(得分:0)

我不认为console.log会执行toString。但是当你使用alert()尝试它时,你会发现它有效:

x=function(val){this.val=val;};
y=new x(20)
x.prototype.toString=function(){return "my value is: " + this.val;};
alert(y)

对于valueOf:

x.prototype.valueOf=function(){return this.val + 10;};
alert(y+5)