所以我正在进行个人研究,并试图更多地了解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。
答案 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
相同
是的,当对象被转换为原始值时,会自动调用valueOf
和toString
- 例如当在其上使用数学运算符或使用字符串进行连接时。准确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)