Javascript在实例化时更改子类属性

时间:2012-03-05 12:08:21

标签: javascript oop

如果我有

myClass.prototype.subClass=
{
foo:false
}

当我在一个对象上创建一个新实例时,我怎样才能每次都将foo设置为不同的值,所以我如何在这里引用该子类

var newObj = new myclass();

2 个答案:

答案 0 :(得分:1)

对象和数组不应该添加到原型中,除非要与所有实例共享它们。

只要您希望每个实例的这些对象的属性不同,您就必须将构造函数(或任何其他函数)中的对象分配给特定实例:

this.subClass = {
    foo: true
    // potentially other properties
};

也就是说,原型中可能存在“默认”对象的情况可能是合理的,但你不应该写它。


在构造函数中分配对象不会重复代码,并允许您为每个实例单独更改代码。


<强>更新

如果您不想更改原始构造函数,可以只是向原型添加一个新函数,并在实例化对象时调用它:

MyClass.prototype.init = function() {
    this.subClass = {
        //...
    };
};

var obj = new MyClass();
obj.init();

或者你真的创建了一个新的构造函数:

function MySubClass() {
    MyClass.apply(this, arguments);
    // now create that object for each instance
    this.subClass = {
        foo: someValue
    };
}

inherits(MySubClass, MyClass);

其中inherits定义为:

function inherits(Child, Parent) {
    var Tmp_ = function() {};
    Tmp_.prototype = Parent.prototype;
    Child.prototype = new Tmp_();
    Child.prototype.constructor = Child;
}

然后,您将使用MySubClass代替MyClass来创建实例。

答案 1 :(得分:0)

我认为你理解原型继承是如何工作的,因为这个问题有点奇怪。但您应该能够像其他任何一样访问foo属性:

newObj.subClass.foo = newValue