我是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
来运行它。
更新
发现了如何在Object中显示所有值。将enumerable:True
设置为对象将自动显示所有值。我想弄清楚怎么做。对于任何也使用Node.js
的人。
答案 0 :(得分:1)
如果您使用Object.getOwnPropertyDescriptors(Object.getPrototypeOf(q))
,您应该会看到p
的继承属性。如果您检查与Object.getPrototypeOf()
的平等,q
的原型应该等于p
。
答案 1 :(得分:0)
使用奇怪的类定义和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