Javascript:继承测试问题(JS权威指南提供的代码问题)

Javascript:继承测试问题(JS权威指南提供的代码问题),javascript,node.js,inheritance,Javascript,Node.js,Inheritance,我是Javascript新手。通常编写Python/PHP。目前正在阅读《JavaScript:权威指南:激活您的网页》(权威指南) 我正在尝试找出为什么它不起作用,下面将详细解释为什么可能的话也会出现这种情况,而不是属性getter/setter和继承 我正在使用的函数: function inherit(p) { if (p == null) throw TypeError(); if (Object.create) return Object.create(p);

我是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上使用节点v6.11.3来运行此功能

更新:


发现了如何显示对象中的所有值。为对象设置
enumerable:True
,将自动显示所有值。我想知道怎么做。适用于同时使用
Node.js
的用户

如果使用
Object.getOwnPropertyDescriptors(Object.getPrototypeOf(q))
您应该可以看到
p
中继承的属性。如果使用“代码>对象.GETPrimeType Of()/代码>来检查等式,则<>代码> q>代码>的原型应等于<代码> p>代码> .< /p> 使用奇怪的类定义和实例,如<代码>继承< /代码>函数被认为是一个坏的实践,如果可以的话,请考虑使用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

代码正常工作。您没有正确地查看全部结果。如果您记录
q
,您将看到所有继承的属性。您看到的
{}
正是控制台告诉您从
inherit(p)
返回对象的方式。将
console.log(inherit(p))
添加到代码底部并运行它。还有,看看这个,是的。或者在浏览器控制台中运行整个程序,以便轻松单击。我没有意识到我可以将Chrome/FF中的控制台与JS代码片段一起使用。出于好奇,在使用
节点时,是否有任何简单的方法可以在终端中获取此信息?我尝试了
console.log(inherit(p))
,但仍然给出了
{}
iPython
我可以使用“who”查看所有变量并快速查看它们的变量。使用所讨论的
util.inspect()
这很好,谢谢。这应该是一个注释,因为一开始没有问题。不同意。问题是,他无法通过在控制台中简单地键入
q
来查看完整的输出。这就解决了问题。@这种问题与代码无关。问题与所提供的代码无关。因此,这是一个应该就此结束的问题(我已将其标记为)。这类问题应该只有注释,没有答案。@JusMalcolm我注意到我可以在对象(
object.defineProperty()
)上设置
enumerate:true
),这将自动显示值(使用终端中的node.js,Chrome js控制台)。谢谢你给我指明了正确的方向。