让一个Object在Javascript中返回除了它自己以外的东西

时间:2017-03-02 20:42:33

标签: javascript

我正在处理的一段代码将从语义的角度来看,从调用“只是一个对象”的能力中获益,而不是整个对象。这可能听起来令人困惑,所以我将详细说明代码。 如果我将Object构造函数'rectangle'定义为:

function Rectangle(side1, side2) {
    this.area = side1 * side2;    
}

我当时希望能够做的是调用该对象的实例,然后为它获取返回值:

var foo = new Rectangle(1, 2);
return foo;

现在,返回值将类似于键:值对。但是,我想要的是返回值,如“Hi Dave”。我已阅读互联网上的各种文件,但未找到任何合适的文件。

虽然我知道我可以为“Hi Dave”声明指定一个属性名称,然后调用它;对于我的应用程序,没有语义意义。我也知道'this'不是变量,因此我不能只指定它。

非常感谢任何帮助。

编辑:对我想要的内容进行调整以避免混淆。

2 个答案:

答案 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();