【问题标题】:Javavscript change sub-class property on instantiationJavascript在实例化时更改子类属性
【发布时间】:2012-03-05 12:08:20
【问题描述】:

如果我有

myClass.prototype.subClass=
{
foo:false
}

当我在一个对象上创建一个新实例时,如何每次都将 foo 设置为不同的值,那么我如何在此处引用该子类

var newObj = new myclass();

【问题讨论】:

  • 澄清一下:您是希望每个实例都有自己的subClass.foo 值,还是希望每次为所有 个实例都更改它?

标签: javascript oop


【解决方案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 来创建实例。

【讨论】:

  • 我知道我可以在构造函数中访问子类,但在这种情况下,我将一个特定的子类添加到更通用的构造函数中,并且不想更改构造函数以适应此任务。也许我可以使用继承,但我不太确定该怎么做。
  • 感谢 Felix 不确定是否足够简洁,我将尝试绕过承包商,设置子类属性然后触发构造函数,这是对超类的更改,但是一个我可以应付。
【解决方案2】:

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

newObj.subClass.foo = newValue

【讨论】:

  • 这将更改所有实例的subClass.foo
  • 既然 OP 说how can I set foo to a different value each time,这似乎并不重要。
  • OP 应该尝试进一步理解原型继承。
  • 你说得对,我要打开一个关于继承的不同问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多