我试图将原型继承应用于Javascript中的函数。这一切都很简单,甚至在Wikipedia's javascript lemma中有描述。它的工作原理,如果我的属性是简单的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);
随着Employee.prototype = new Person();
,所有的人的属性和(原型)的方法是由雇员,这是基本的继承继承。
这按预期工作:bob is 1 pete is 6
现在,我开始与皮特的位置摆弄(后庆祝)
pete.celebrate();
pete.location.absolute=true;
显示bob.location.absolute显示:true
,这是禁忌直观(我没有碰bob的位置,所以我期望它的初始值在Person
中声明),并且破坏了我的解决方案。
在我最初的理解中,这应该是错误的。我意识到我可能应该从最初的人克隆位置对象,但我不确定在哪里或如何做到这一点。 如果还有更好的继承技术?
使用createObject(Person)而不是新Person()的好处是什么?它只增加了一层间接原型。 – Kosta 2012-01-04 10:10:21
@Kosta可以避免继承时运行构造函数的副作用。构造函数通常在其中有初始化代码,当你没有实例化任何东西时,你不想运行。 '新员工'仍然是'instanceof Person',因为'Person.prototype'和'f.prototype'指向同一个对象。 – Esailija 2012-01-04 10:13:12
但是你仍然在createObject()中运行构造函数(一次)。此外,您正在运行Employee()中的构造函数(在每个实例化上)。你能举一个例子,其中createObject()是有用的吗? – Kosta 2012-01-04 10:29:17