所以我有一个我创建的这个例子,我有一个问题,为什么我的子对象的行为方式如此。我正在创建一个Cat对象,并创建该对象的实例名称Kat。然后我使用下面的object()方法来扩展Kat以创建一个名为Poe的对象。
function object(o) {
function f() {};
f.prototype = o;
return new f();
}
我的问题是,为什么Poe似乎与Kat共享私有实例变量和方法,即使Poe的公共变量被覆盖了?此外,这些公共方法与原型公共方法一起工作正常。
答案 0 :(得分:0)
设置原型将导致新对象委托传递给其中未定义的属性的对象。构造函数不会为子对象运行,因此它最初会有一些未定义的变量:
function object(o) {
function f() {};
f.prototype = o;
return new f();
}
var object1 = { a: 1 };
var object2 = object(object1);
object1.a = 2
console.log(object2.a); // 2
如果您需要独立属性,则需要将它们复制为:
function object(o) {
var newObj = {};
for(var key in o) {
newObj[key] = o[key];
}
return newObj;
}
但是从闭包中访问私有实例变量。同一函数的任何副本都将使用相同的私有变量。您需要使用类似that.is_bored = 0
的内容来定义变量。
答案 1 :(得分:0)
您可能还希望将当前的Cat功能更改为真实对象。通过将它作为一个函数,您将经典继承与原型相结合。记住您当前的原型克隆功能(您已标记为对象)将为您创建一个新类,因此
return new f();
以下是我将如何重写以更好地遵循原型继承设计模式的示例。