【问题标题】:Javascript: issue with inheritance test (JS Definitive Guide book supplied code issue)Javascript:继承测试问题(JS Definitive Guide book 提供的代码问题)
【发布时间】:2017-12-08 20:53:49
【问题描述】:

我是 Javascript 新手。通常写 Python/PHP。目前正在阅读 JavaScript:权威指南:激活您的网页(权威指南)

使用的部分示例代码我试图弄清楚为什么它不起作用,如果可能的话,详细解释为什么也可以在属性 getter/setter 和继承下方。

我正在使用的功能:

function inherit(p) {
     if (p == null) throw TypeError(); 
     if (Object.create) return Object.create(p); 
     var t = typeof p; 
     if (t !== "object" && t !== "function") throw TypeError();
     function f() {}; 
     f.prototype = p; 
     return new f();
}

var p = {
    x: 1.0,
    y: 1.0,
    get r() { 
        return Math.sqrt(this.x*this.x + this.y*this.y); 
    },
    set r(newvalue) {
        var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y);
        var ratio = newvalue/oldvalue;
        this.x *= ratio;
        this.y *= ratio;
    },
        get theta() { return Math.atan2(this.y, this.x); }
};

当我运行测试时。我看不到任何被继承的东西。

> var q = inherit(p)
undefined
> q
{}
> p
{ x: 1, y: 1, r: [Getter/Setter], theta: [Getter] }

这是为什么?我目前在 Mac 上使用node v6.11.3 来运行它。

更新:

发现了如何显示对象中的所有值。将enumerable:True 设置为对象将自动显示所有值。我试图弄清楚该怎么做。对于也使用Node.js 的任何人。

【问题讨论】:

  • 代码可以正常工作。您没有正确查看完整结果。如果您登录q,您将看到所有继承的属性。您看到的{} 正是控制台告诉您从inherit(p) 返回对象的方式。将console.log(inherit(p)) 添加到代码底部并运行它。另外,请参阅此 Fiddle
  • 是的。或者在您的浏览器控制台中运行整个程序,以便轻松点击。
  • 没有意识到我可以像这样在 JS sn-ps 代码中使用 Chrome/FF 中的控制台。出于好奇,在使用node 时,是否有任何简单的方法可以在终端中获取此信息?我试过console.log(inherit(p)) 仍然给{}iPython 我可以使用 'who' 来查看所有变量并快速查看它们的变量。
  • 使用 util.inspect() 讨论 here
  • 这太好了,谢谢。

标签: javascript node.js inheritance


【解决方案1】:

如果您使用Object.getOwnPropertyDescriptors(Object.getPrototypeOf(q)),您应该会看到从p 继承的属性。如果用Object.getPrototypeOf()检查相等,q的原型应该等于p

【讨论】:

  • 这应该是注释,因为一开始没有问题。
  • 不同意。问题是他无法通过在控制台中输入q 来查看完整的输出。这样就解决了问题。
  • @Will 这种问题与代码无关。该问题与提供的代码无关。因此,这是一个应该在 SO 上结束的问题(我已将其标记为这样)。这类问题应该只有 cmets,没有答案。
  • @JusMalcolm 我注意到我可以在对象 (Object.defineProperty()) 上设置 enumerate:true,这将自动显示值(在终端中使用 node.js,Chrome js 控制台)。感谢您为我指明正确的方向。
【解决方案2】:

使用奇怪的类定义和实例,如inherit 函数被认为是一种不好的做法,如果可以,请考虑使用 js 类 ES6 定义,或者如果必须使用 ES5,则考虑使用函数对象定义或原型。

这里如何使用 ES6 类定义

class p {

    constructor() {
        this.x = 1.0;
        this.y = 1.0;
    }    

    get r() { 
        return Math.sqrt(this.x*this.x + this.y*this.y); 
    }

    set r(newvalue) {
        var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y);
        var ratio = newvalue/oldvalue;
        this.x *= ratio;
        this.y *= ratio;
    }

    get theta() { return Math.atan2(this.y, this.x); }

}

var q = new p();
> q
{x: 1, y: 1}
> q.r = 6
> q.theta

【讨论】:

    猜你喜欢
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    相关资源
    最近更新 更多