我正在处理的一段代码将从语义的角度来看,从调用“只是一个对象”的能力中获益,而不是整个对象。这可能听起来令人困惑,所以我将详细说明代码。 如果我将Object构造函数'rectangle'定义为:
function Rectangle(side1, side2) {
this.area = side1 * side2;
}
我当时希望能够做的是调用该对象的实例,然后为它获取返回值:
var foo = new Rectangle(1, 2);
return foo;
现在,返回值将类似于键:值对。但是,我想要的是返回值,如“Hi Dave”。我已阅读互联网上的各种文件,但未找到任何合适的文件。
虽然我知道我可以为“Hi Dave”声明指定一个属性名称,然后调用它;对于我的应用程序,没有语义意义。我也知道'this'不是变量,因此我不能只指定它。
非常感谢任何帮助。
编辑:对我想要的内容进行调整以避免混淆。
答案 0 :(得分:2)
我认为您最接近的方法是覆盖.prototype.valueOf
和.prototype.toString
方法。这并不能完全满足您的需求,可以获得不同的 return 值,但是,当与字符串一起使用时,它会为您提供所需的值。
class StringRectangle {
constructor(val1, val2) {
this.area = val1 * val2;
this.__proto__.valueOf = () => 'My area is: ' + this.area;
this.__proto__.toString = () => 'My area is: ' + this.area;
}
}
const stringRect = new StringRectangle(2, 3);
// This is where the above fails for what you want
stringRect; // StringRectangle {area: 6}
// But, maybe these are good enough, since you're displaying strings?
// Uses valueOf
'My area is: ' + stringRect + '!'; // My area is: 6!
// Uses toString
`My area is: ${stringRect}!` // My area is: 6!
进一步研究您的理想解决方案,我认为没有任何方法可以通过浏览器进行,如果有的话。引用的值存储在机器级别。例如:console.log
实际上做了什么?我不知道没有查看V8代码:
console.log(console.log); // function log() { [native code] }
这是本机代码位,这是限制部分。如果您想深入研究本机代码{8},请访问V8 console.log。
感谢您的学习;有一段时间没有把这么多的东西钻进原型。
答案 1 :(得分:1)
您可以在static
class
方法
class Rectangle {
constructor(side1, side2) {
this.area = side1 * side2;
}
static whoAmI() {return "I am a rectangle"}
}
var foo = new Rectangle(1, 2);
Rectangle.whoAmI();