javascript中的原型对象继承

时间:2014-06-04 16:03:40

标签: javascript

所以我有一个我创建的这个例子,我有一个问题,为什么我的子对象的行为方式如此。我正在创建一个Cat对象,并创建该对象的实例名称Kat。然后我使用下面的object()方法来扩展Kat以创建一个名为Poe的对象。

function object(o) {
    function f() {};
    f.prototype = o;
    return new f();
}

我的问题是,为什么Poe似乎与Kat共享私有实例变量和方法,即使Poe的公共变量被覆盖了?此外,这些公共方法与原型公共方法一起工作正常。

http://jsfiddle.net/ka_tee_jean/5aPT2/

2 个答案:

答案 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();

以下是我将如何重写以更好地遵循原型继承设计模式的示例。

http://jsfiddle.net/scottcarlson/Dfnn3/2/