javascript原型继承和对象属性

dr *_*rry 6 javascript inheritance

我正在尝试将原型继承应用于Javascript中的函数.这一切都很简单,甚至在维基百科的javascript引理中也有描述.如果我的属性是简单的javascript类型,它可以工作:

function Person() {
    this.age = 0;
    this.location = {
        x: 0,
        y: 0,
        absolute: false
    };
};

function Employee() {};

Employee.prototype = new Person();
Employee.prototype.celebrate = function () {
    this.age++;
}

var pete = new Employee();
pete.age = 5;
pete.celebrate();
var bob = new Employee();
bob.celebrate();
console.log("bob is " + bob.age + " pete is " + pete.age);
Run Code Online (Sandbox Code Playgroud)

使用Employee.prototype = new Person();,所有Person的属性和(prototyped)方法都由Employee继承,这是继承的基础.

这按预期工作: bob is 1 pete is 6

现在我开始摆弄皮特的位置(庆祝之后)

pete.celebrate();
pete.location.absolute=true;
Run Code Online (Sandbox Code Playgroud)

显示bob.location.absolute显示:true,这是直观的反对(我没有触及bob的位置,所以我希望它具有声明的初始值Person)并破坏我的解决方案.

在我最初的理解中,这应该是错误的.我确实意识到我可能应该从最初的Person克隆位置对象,但我不知道在哪里或如何做到这一点.如果有更好的继承技术?

Kos*_*sta 3

当您实例化一个新的 Employee 时,Person 的所有属性都会被复制。由于这是浅拷贝,皮特和鲍勃共享相同的位置对象。对于你的问题,似乎没有一个很好的解决方案。您可以使用框架或进行如下修改:

function Employee() { Person.apply(this); };
Run Code Online (Sandbox Code Playgroud)

这会在 this 对象的上下文中调用 Person 构造函数。

MDC 有更多相关信息:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply