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

时间:2017-12-08 20:53:49

标签: 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); 
     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的人。

2 个答案:

答案 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