复制和修改用于实例化javascript的类似对象

时间:2013-07-26 22:09:10

标签: javascript design-patterns object

我有一个看起来像

的对象
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不是函数。

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

3 个答案:

答案 0 :(得分:1)

如果customObject不是主机对象(即如果尝试以不同的方式调用它,则不会给出非法调用错误),您可以将构造函数应用于其他 this 对象;

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();
}

答案 1 :(得分:0)

我认为this should answer your question。基本上,new关键字是返回一个对象而不是一个函数。

答案 2 :(得分:0)

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

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

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