Javascript:继承测试问题(JS权威指南提供的代码问题)
我是Javascript新手。通常编写Python/PHP。目前正在阅读《JavaScript:权威指南:激活您的网页》(权威指南) 我正在尝试找出为什么它不起作用,下面将详细解释为什么可能的话也会出现这种情况,而不是属性getter/setter和继承 我正在使用的函数: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);
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控制台)。谢谢你给我指明了正确的方向。