0

我有一个看起来像的对象

var customObject = function() {
    this.property = "value";
};

customObject.prototype = new otherObject();

customObject.prototype.property2 = function() {};

等等 - 它比这大得多。

我可以通过编写成功地实例化对象new customObject()

现在我想创建一个相当相似的对象,虽然有点不同。这涉及修改某些属性,甚至可能添加或删除一些属性。如上例所示,我希望它可以通过编写new customObject2().

我以为我可以简单地做:

var customObject2 = new customObject();
customObject2.prototype = customObject.prototype;
customObject2.property = "modified value";

等等

但是,当我尝试通过这样做来实例化它时,new customObject2()我收到一个错误,指出 customObject2 不是一个函数。

我希望我能很好地说明我想要创建什么样的模式。我应该采取什么方法来创建这样的模式?

4

3 回答 3

1

如果customObject不是主机对象(即,如果您尝试以与预期不同的方式调用它,不会给您非法调用错误)您可以构造函数应用于不同的this Object

var customObject2 = function () {
    customObject.call(this); // construct as if `customObject`
    // now do more stuff
    this.anotherProperty = 'foo';
};
customObject2.prototype = Object.create(customObject.prototype);
    // inherit prototype but keep original safe

new customObject2();

向后兼容Object.create

function objectWithProto(proto) {
    var f;
    if (Object.create) return Object.create(proto);
    f = function () {};
    f.prototype = proto;
    return new f();
}
于 2013-07-26T22:24:07.910 回答
0

I think this should answer your question. Basically, the new keyword is returning an object and not a function.

于 2013-07-26T22:18:44.070 回答
0

为什么不使用第一次使用的相同公式?例如:

var customObject2 = function(){};
customObject2.prototype = new customObject();
customObject2.property = "modified value";
new customObject2(); // works!

的所有属性都customObjectcustomObject2通过原型链由 的实例继承。

于 2013-07-26T22:22:06.760 回答